summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Gillespie <sean.william.g@gmail.com>2016-03-09 18:57:22 -0800
committerSean Gillespie <sean.william.g@gmail.com>2016-03-09 18:57:22 -0800
commite483278934c3140092a4b6913fe5d7c88d5d943e (patch)
treeed5c58ae65602fb6d6655a70304e8463828bdaf1
parent587e7c08ef1edc53d2ce6bf90da0c63ba70aa00b (diff)
parentf7c51223d7b3a0153b002b30f619a7f02ff4fc99 (diff)
downloadcoreclr-e483278934c3140092a4b6913fe5d7c88d5d943e.tar.gz
coreclr-e483278934c3140092a4b6913fe5d7c88d5d943e.tar.bz2
coreclr-e483278934c3140092a4b6913fe5d7c88d5d943e.zip
Merge pull request #3394 from swgillespie/gctests
Initial bringup of new set of ported GC tests.
-rw-r--r--tests/issues.targets105
-rw-r--r--tests/src/GC/API/GC/AddMemoryPressureTest.cs210
-rw-r--r--tests/src/GC/API/GC/AddMemoryPressureTest.csproj53
-rw-r--r--tests/src/GC/API/GC/AddThresholdTest.cs110
-rw-r--r--tests/src/GC/API/GC/AddThresholdTest.csproj53
-rw-r--r--tests/src/GC/API/GC/AddUsageTest.cs112
-rw-r--r--tests/src/GC/API/GC/AddUsageTest.csproj53
-rw-r--r--tests/src/GC/API/GC/Collect.cs32
-rw-r--r--tests/src/GC/API/GC/Collect.csproj53
-rw-r--r--tests/src/GC/API/GC/Collect0.cs52
-rw-r--r--tests/src/GC/API/GC/Collect0.csproj53
-rw-r--r--tests/src/GC/API/GC/Collect1.cs49
-rw-r--r--tests/src/GC/API/GC/Collect1.csproj53
-rw-r--r--tests/src/GC/API/GC/Collect_Default.cs48
-rw-r--r--tests/src/GC/API/GC/Collect_Default_1.csproj54
-rw-r--r--tests/src/GC/API/GC/Collect_Default_2.csproj54
-rw-r--r--tests/src/GC/API/GC/Collect_Default_3.csproj54
-rw-r--r--tests/src/GC/API/GC/Collect_Forced.cs51
-rw-r--r--tests/src/GC/API/GC/Collect_Forced_1.csproj54
-rw-r--r--tests/src/GC/API/GC/Collect_Forced_2.csproj54
-rw-r--r--tests/src/GC/API/GC/Collect_Forced_3.csproj54
-rw-r--r--tests/src/GC/API/GC/Collect_Optimized.cs69
-rw-r--r--tests/src/GC/API/GC/Collect_Optimized_1.csproj54
-rw-r--r--tests/src/GC/API/GC/Collect_Optimized_2.csproj54
-rw-r--r--tests/src/GC/API/GC/Collect_Optimized_3.csproj54
-rw-r--r--tests/src/GC/API/GC/Collect_fail.cs58
-rw-r--r--tests/src/GC/API/GC/Collect_fail.csproj53
-rw-r--r--tests/src/GC/API/GC/Collect_neg.cs36
-rw-r--r--tests/src/GC/API/GC/Collect_neg.csproj53
-rw-r--r--tests/src/GC/API/GC/CollectionCountTest.cs146
-rw-r--r--tests/src/GC/API/GC/CollectionCountTest.csproj53
-rw-r--r--tests/src/GC/API/GC/Finalize.cs57
-rw-r--r--tests/src/GC/API/GC/Finalize.csproj53
-rw-r--r--tests/src/GC/API/GC/GetGeneration.cs135
-rw-r--r--tests/src/GC/API/GC/GetGeneration.csproj53
-rw-r--r--tests/src/GC/API/GC/GetGenerationWR.cs68
-rw-r--r--tests/src/GC/API/GC/GetGenerationWR.csproj53
-rw-r--r--tests/src/GC/API/GC/GetGenerationWR2.cs58
-rw-r--r--tests/src/GC/API/GC/GetGenerationWR2.csproj54
-rw-r--r--tests/src/GC/API/GC/GetGeneration_box.cs79
-rw-r--r--tests/src/GC/API/GC/GetGeneration_box.csproj54
-rw-r--r--tests/src/GC/API/GC/GetGeneration_fail.cs40
-rw-r--r--tests/src/GC/API/GC/GetGeneration_fail.csproj54
-rw-r--r--tests/src/GC/API/GC/GetTotalMemory.cs76
-rw-r--r--tests/src/GC/API/GC/GetTotalMemory.csproj54
-rw-r--r--tests/src/GC/API/GC/KeepAlive.cs84
-rw-r--r--tests/src/GC/API/GC/KeepAlive.csproj53
-rw-r--r--tests/src/GC/API/GC/KeepAliveNull.cs56
-rw-r--r--tests/src/GC/API/GC/KeepAliveNull.csproj53
-rw-r--r--tests/src/GC/API/GC/KeepAliveRecur.cs55
-rw-r--r--tests/src/GC/API/GC/KeepAliveRecur.csproj53
-rw-r--r--tests/src/GC/API/GC/MaxGeneration.cs29
-rw-r--r--tests/src/GC/API/GC/MaxGeneration.csproj54
-rw-r--r--tests/src/GC/API/GC/ReRegisterForFinalize.cs67
-rw-r--r--tests/src/GC/API/GC/ReRegisterForFinalize.csproj54
-rw-r--r--tests/src/GC/API/GC/ReRegisterForFinalize_null.cs42
-rw-r--r--tests/src/GC/API/GC/ReRegisterForFinalize_null.csproj53
-rw-r--r--tests/src/GC/API/GC/RemoveMemoryPressureTest.cs132
-rw-r--r--tests/src/GC/API/GC/RemoveMemoryPressureTest.csproj53
-rw-r--r--tests/src/GC/API/GC/RemoveUsageTest.cs114
-rw-r--r--tests/src/GC/API/GC/RemoveUsageTest.csproj53
-rw-r--r--tests/src/GC/API/GC/SuppressFinalize.cs40
-rw-r--r--tests/src/GC/API/GC/SuppressFinalize.csproj54
-rw-r--r--tests/src/GC/API/GC/SuppressFinalize_Null.cs42
-rw-r--r--tests/src/GC/API/GC/SuppressFinalize_Null.csproj53
-rw-r--r--tests/src/GC/API/GC/TotalMemory.cs37
-rw-r--r--tests/src/GC/API/GC/TotalMemory.csproj54
-rw-r--r--tests/src/GC/API/GC/TotalMemory2.cs45
-rw-r--r--tests/src/GC/API/GC/TotalMemory2.csproj53
-rw-r--r--tests/src/GC/API/GC/app.config27
-rw-r--r--tests/src/GC/API/GCHandle/AddrOfPinnedObject.cs37
-rw-r--r--tests/src/GC/API/GCHandle/AddrOfPinnedObject.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/AddrOfPinnedObject_neg.cs64
-rw-r--r--tests/src/GC/API/GCHandle/AddrOfPinnedObject_neg.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/Alloc.cs34
-rw-r--r--tests/src/GC/API/GCHandle/Alloc.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/Alloc_neg.cs40
-rw-r--r--tests/src/GC/API/GCHandle/Alloc_neg.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/Alloc_neg2.cs57
-rw-r--r--tests/src/GC/API/GCHandle/Alloc_neg2.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/Casting.cs125
-rw-r--r--tests/src/GC/API/GCHandle/Casting.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/Equality.cs99
-rw-r--r--tests/src/GC/API/GCHandle/Equality.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/Free.cs37
-rw-r--r--tests/src/GC/API/GCHandle/Free.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/Free_neg.cs51
-rw-r--r--tests/src/GC/API/GCHandle/Free_neg.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/HandleCopy.cs82
-rw-r--r--tests/src/GC/API/GCHandle/HandleCopy.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/IsAllocated.cs49
-rw-r--r--tests/src/GC/API/GCHandle/IsAllocated.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/Normal.cs48
-rw-r--r--tests/src/GC/API/GCHandle/Normal.csproj54
-rw-r--r--tests/src/GC/API/GCHandle/PinObj_neg.cs40
-rw-r--r--tests/src/GC/API/GCHandle/PinObj_neg.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/Pinned.cs44
-rw-r--r--tests/src/GC/API/GCHandle/Pinned.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/Target.cs68
-rw-r--r--tests/src/GC/API/GCHandle/Target.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/Target_neg.cs75
-rw-r--r--tests/src/GC/API/GCHandle/Target_neg.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/ToFromIntPtr.cs127
-rw-r--r--tests/src/GC/API/GCHandle/ToFromIntPtr.csproj53
-rw-r--r--tests/src/GC/API/GCHandle/Weak.cs68
-rw-r--r--tests/src/GC/API/GCHandle/Weak.csproj52
-rw-r--r--tests/src/GC/API/GCHandle/app.config27
-rw-r--r--tests/src/GC/API/GCHandleCollector/Count.cs224
-rw-r--r--tests/src/GC/API/GCHandleCollector/Count.csproj53
-rw-r--r--tests/src/GC/API/GCHandleCollector/CtorsAndProperties.cs128
-rw-r--r--tests/src/GC/API/GCHandleCollector/CtorsAndProperties.csproj53
-rw-r--r--tests/src/GC/API/GCHandleCollector/NegTests.cs178
-rw-r--r--tests/src/GC/API/GCHandleCollector/NegTests.csproj53
-rw-r--r--tests/src/GC/API/GCHandleCollector/Usage.cs226
-rw-r--r--tests/src/GC/API/GCHandleCollector/Usage.csproj53
-rw-r--r--tests/src/GC/API/GCHandleCollector/app.config27
-rw-r--r--tests/src/GC/API/GCSettings/ILatencyTest.csproj6
-rw-r--r--tests/src/GC/API/GCSettings/InducedGen0GC.csproj6
-rw-r--r--tests/src/GC/API/GCSettings/InducedGen1GC.csproj6
-rw-r--r--tests/src/GC/API/GCSettings/InducedGen2GC.csproj6
-rw-r--r--tests/src/GC/API/GCSettings/InputValidation.cs147
-rw-r--r--tests/src/GC/API/GCSettings/InputValidation.csproj54
-rw-r--r--tests/src/GC/API/GCSettings/app.config27
-rw-r--r--tests/src/GC/API/WeakReference/Finalize.cs67
-rw-r--r--tests/src/GC/API/WeakReference/Finalize.csproj54
-rw-r--r--tests/src/GC/API/WeakReference/Finalize2.cs185
-rw-r--r--tests/src/GC/API/WeakReference/Finalize2.csproj53
-rw-r--r--tests/src/GC/API/WeakReference/IsAlive.cs41
-rw-r--r--tests/src/GC/API/WeakReference/IsAlive.csproj54
-rw-r--r--tests/src/GC/API/WeakReference/IsAlive_neg.cs34
-rw-r--r--tests/src/GC/API/WeakReference/IsAlive_neg.csproj54
-rw-r--r--tests/src/GC/API/WeakReference/NullHandle.cs98
-rw-r--r--tests/src/GC/API/WeakReference/NullHandle.csproj53
-rw-r--r--tests/src/GC/API/WeakReference/Target.cs99
-rw-r--r--tests/src/GC/API/WeakReference/Target.csproj53
-rw-r--r--tests/src/GC/API/WeakReference/TrackResurrection.cs38
-rw-r--r--tests/src/GC/API/WeakReference/TrackResurrection.csproj54
-rw-r--r--tests/src/GC/API/WeakReference/app.config27
-rw-r--r--tests/src/GC/API/WeakReference/multipleWRs.cs94
-rw-r--r--tests/src/GC/API/WeakReference/multipleWRs.csproj54
-rw-r--r--tests/src/GC/API/WeakReference/multipleWRs_1.csproj54
-rw-r--r--tests/src/GC/Coverage/271010.cs34
-rw-r--r--tests/src/GC/Coverage/271010.csproj45
-rw-r--r--tests/src/GC/Coverage/LargeObjectAlloc.csproj7
-rw-r--r--tests/src/GC/Coverage/LargeObjectAlloc2.csproj6
-rw-r--r--tests/src/GC/Coverage/app.config31
-rw-r--r--tests/src/GC/Coverage/concurrentspin2.cs184
-rw-r--r--tests/src/GC/Coverage/concurrentspin2.csproj45
-rw-r--r--tests/src/GC/Coverage/delete_next_card_table.cs63
-rw-r--r--tests/src/GC/Coverage/delete_next_card_table.csproj45
-rw-r--r--tests/src/GC/Coverage/smalloom.cs72
-rw-r--r--tests/src/GC/Coverage/smalloom.csproj45
-rw-r--r--tests/src/GC/Features/BackgroundGC/app.config31
-rw-r--r--tests/src/GC/Features/BackgroundGC/concurrentspin2.cs184
-rw-r--r--tests/src/GC/Features/BackgroundGC/concurrentspin2.csproj45
-rw-r--r--tests/src/GC/Features/BackgroundGC/foregroundgc.cs93
-rw-r--r--tests/src/GC/Features/BackgroundGC/foregroundgc.csproj45
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeio/app.config31
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeio/finalizeio.cs103
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeio/finalizeio.csproj45
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/app.config31
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizearray.cs59
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizearray.csproj45
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizearraysleep.cs59
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizearraysleep.csproj45
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizedest.cs60
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizedest.csproj45
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizedirectedgraph.cs262
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizedirectedgraph.csproj45
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizeexcep.cs72
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizeexcep.csproj45
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizeinherit.cs97
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizeinherit.csproj45
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizenested.cs126
-rw-r--r--tests/src/GC/Features/Finalizer/finalizeother/finalizenested.csproj45
-rw-r--r--tests/src/GC/Features/HeapExpansion/Finalizer.csproj6
-rw-r--r--tests/src/GC/Features/HeapExpansion/GCUtil_HeapExpansion.csproj6
-rw-r--r--tests/src/GC/Features/HeapExpansion/Handles.csproj6
-rw-r--r--tests/src/GC/Features/HeapExpansion/bestfit-finalize.cs197
-rw-r--r--tests/src/GC/Features/HeapExpansion/bestfit-finalize.csproj45
-rw-r--r--tests/src/GC/Features/HeapExpansion/bestfit-threaded.cs195
-rw-r--r--tests/src/GC/Features/HeapExpansion/bestfit-threaded.csproj45
-rw-r--r--tests/src/GC/Features/HeapExpansion/bestfit.cs196
-rw-r--r--tests/src/GC/Features/HeapExpansion/bestfit.csproj46
-rw-r--r--tests/src/GC/Features/HeapExpansion/bestfit_1.csproj54
-rw-r--r--tests/src/GC/Features/HeapExpansion/expandheap.cs38
-rw-r--r--tests/src/GC/Features/HeapExpansion/expandheap.csproj48
-rw-r--r--tests/src/GC/Features/HeapExpansion/plug.cs86
-rw-r--r--tests/src/GC/Features/HeapExpansion/plug.csproj45
-rw-r--r--tests/src/GC/Features/HeapExpansion/pluggaps.cs51
-rw-r--r--tests/src/GC/Features/HeapExpansion/pluggaps.csproj48
-rw-r--r--tests/src/GC/Features/HeapExpansion/project.json34
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/app.config31
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivearray.cs46
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivearray.csproj45
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivedirectedgraph.cs272
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivedirectedgraph.csproj45
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivefinalize.cs54
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivefinalize.csproj45
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivehandle.cs45
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivehandle.csproj45
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivescope.cs68
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivescope.csproj45
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetry.cs60
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetry.csproj45
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetypes.cs70
-rw-r--r--tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetypes.csproj45
-rw-r--r--tests/src/GC/Features/LOHCompaction/app.config31
-rw-r--r--tests/src/GC/Features/LOHCompaction/lohcompact_stress.cs189
-rw-r--r--tests/src/GC/Features/LOHCompaction/lohcompact_stress.csproj45
-rw-r--r--tests/src/GC/Features/LOHCompaction/lohcompactapi.cs137
-rw-r--r--tests/src/GC/Features/LOHCompaction/lohcompactapi.csproj45
-rw-r--r--tests/src/GC/Features/LOHCompaction/lohcompactapi2.cs218
-rw-r--r--tests/src/GC/Features/LOHCompaction/lohcompactapi2.csproj45
-rw-r--r--tests/src/GC/Features/LOHCompaction/lohcompactapi_exceptions.cs63
-rw-r--r--tests/src/GC/Features/LOHCompaction/lohcompactapi_exceptions.csproj45
-rw-r--r--tests/src/GC/Features/LOHCompaction/lohcompactscenariorepro.cs132
-rw-r--r--tests/src/GC/Features/LOHCompaction/lohcompactscenariorepro.csproj45
-rw-r--r--tests/src/GC/Features/LOHCompaction/lohpin.cs114
-rw-r--r--tests/src/GC/Features/LOHCompaction/lohpin.csproj45
-rw-r--r--tests/src/GC/Features/LOHFragmentation/app.config31
-rw-r--r--tests/src/GC/Features/LOHFragmentation/lohfragmentation.cs143
-rw-r--r--tests/src/GC/Features/LOHFragmentation/lohfragmentation.csproj45
-rw-r--r--tests/src/GC/Features/PartialCompaction/app.config31
-rw-r--r--tests/src/GC/Features/PartialCompaction/eco1.cs820
-rw-r--r--tests/src/GC/Features/PartialCompaction/eco1.csproj45
-rw-r--r--tests/src/GC/Features/PartialCompaction/partialcompactiontest.cs698
-rw-r--r--tests/src/GC/Features/PartialCompaction/partialcompactiontest.csproj45
-rw-r--r--tests/src/GC/Features/PartialCompaction/partialcompactionwloh.cs758
-rw-r--r--tests/src/GC/Features/PartialCompaction/partialcompactionwloh.csproj45
-rw-r--r--tests/src/GC/Features/Pinning/PinningOther/GCUtil_Pinning.csproj6
-rw-r--r--tests/src/GC/Features/Pinning/PinningOther/PinnedCollect.csproj6
-rw-r--r--tests/src/GC/Features/Pinning/PinningOther/PinnedHandle.csproj6
-rw-r--r--tests/src/GC/Features/Pinning/PinningOther/PinnedInt.csproj6
-rw-r--r--tests/src/GC/Features/Pinning/PinningOther/PinnedMany.csproj6
-rw-r--r--tests/src/GC/Features/Pinning/PinningOther/PinnedMultiple.csproj6
-rw-r--r--tests/src/GC/Features/Pinning/PinningOther/PinnedObject.csproj6
-rw-r--r--tests/src/GC/Features/Pinning/PinningOther/project.json34
-rw-r--r--tests/src/GC/Features/SustainedLowLatency/app.config31
-rw-r--r--tests/src/GC/Features/SustainedLowLatency/scenario.cs115
-rw-r--r--tests/src/GC/Features/SustainedLowLatency/scenario.csproj45
-rw-r--r--tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race.cs150
-rw-r--r--tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race.csproj45
-rw-r--r--tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race_reverse.cs159
-rw-r--r--tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race_reverse.csproj45
-rw-r--r--tests/src/GC/LargeMemory/API/gc/app.config31
-rw-r--r--tests/src/GC/LargeMemory/API/gc/collect.cs82
-rw-r--r--tests/src/GC/LargeMemory/API/gc/collect.csproj49
-rw-r--r--tests/src/GC/LargeMemory/API/gc/getgeneration.cs105
-rw-r--r--tests/src/GC/LargeMemory/API/gc/getgeneration.csproj49
-rw-r--r--tests/src/GC/LargeMemory/API/gc/gettotalmemory.cs64
-rw-r--r--tests/src/GC/LargeMemory/API/gc/gettotalmemory.csproj49
-rw-r--r--tests/src/GC/LargeMemory/API/gc/keepalive.cs65
-rw-r--r--tests/src/GC/LargeMemory/API/gc/keepalive.csproj49
-rw-r--r--tests/src/GC/LargeMemory/API/gc/largeobject.cs50
-rw-r--r--tests/src/GC/LargeMemory/API/gc/largeobject.csproj46
-rw-r--r--tests/src/GC/LargeMemory/API/gc/reregisterforfinalize.cs62
-rw-r--r--tests/src/GC/LargeMemory/API/gc/reregisterforfinalize.csproj49
-rw-r--r--tests/src/GC/LargeMemory/API/gc/suppressfinalize.cs62
-rw-r--r--tests/src/GC/LargeMemory/API/gc/suppressfinalize.csproj49
-rw-r--r--tests/src/GC/LargeMemory/Allocation/app.config31
-rw-r--r--tests/src/GC/LargeMemory/Allocation/finalizertest.cs171
-rw-r--r--tests/src/GC/LargeMemory/Allocation/finalizertest.csproj49
-rw-r--r--tests/src/GC/LargeMemory/Allocation/largeexceptiontest.cs69
-rw-r--r--tests/src/GC/LargeMemory/Allocation/largeexceptiontest.csproj49
-rw-r--r--tests/src/GC/LargeMemory/Allocation/largeobject.cs50
-rw-r--r--tests/src/GC/LargeMemory/Allocation/largeobject.csproj46
-rw-r--r--tests/src/GC/LargeMemory/Regressions/app.config31
-rw-r--r--tests/src/GC/LargeMemory/Regressions/largearraytest.cs38
-rw-r--r--tests/src/GC/LargeMemory/Regressions/largearraytest.csproj45
-rw-r--r--tests/src/GC/LargeMemory/Regressions/pressureoverflow.cs91
-rw-r--r--tests/src/GC/LargeMemory/Regressions/pressureoverflow.csproj45
-rw-r--r--tests/src/GC/M10/RefCrossTHDs/app.config31
-rw-r--r--tests/src/GC/M10/RefCrossTHDs/refcrossthds.cs172
-rw-r--r--tests/src/GC/M10/RefCrossTHDs/refcrossthds.csproj45
-rw-r--r--tests/src/GC/Regressions/dev10bugs/536168/536168.cs65
-rw-r--r--tests/src/GC/Regressions/dev10bugs/536168/536168.csproj45
-rw-r--r--tests/src/GC/Regressions/dev10bugs/536168/app.config31
-rw-r--r--tests/src/GC/Regressions/v2.0-beta1/149926/149926.cs2
-rw-r--r--tests/src/GC/Regressions/v2.0-beta1/149926/149926.csproj6
-rw-r--r--tests/src/GC/Regressions/v2.0-beta1/149926/project.json34
-rw-r--r--tests/src/GC/Regressions/v2.0-beta1/289745/289745.cs2
-rw-r--r--tests/src/GC/Regressions/v2.0-beta1/289745/289745.csproj6
-rw-r--r--tests/src/GC/Regressions/v2.0-beta1/289745/302560.csproj6
-rw-r--r--tests/src/GC/Regressions/v2.0-beta1/289745/project.json34
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/426480/426480.csproj6
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/426480/project.json34
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/437657/437657.cs333
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/437657/437657.csproj45
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/437657/app.config31
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/445488/445488.cs135
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/445488/445488.csproj45
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/445488/app.config31
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/452950/452950.cs54
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/452950/452950.csproj45
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/452950/app.config31
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/460373/460373.cs117
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/460373/460373.csproj45
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/460373/app.config31
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/462651/462651.cs100
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/462651/462651.csproj45
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/462651/app.config31
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/471729/471729.csproj6
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/471729/project.json34
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/476725/ManagedTest.csproj6
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/476725/project.json34
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/485617/Managed.csproj6
-rw-r--r--tests/src/GC/Regressions/v2.0-beta2/485617/project.json34
-rw-r--r--tests/src/GC/Regressions/v2.0-rtm/494226/494226.csproj6
-rw-r--r--tests/src/GC/Regressions/v2.0-rtm/494226/project.json34
-rw-r--r--tests/src/GC/Regressions/v2.0-rtm/544701/544701.cs2
-rw-r--r--tests/src/GC/Regressions/v2.0-rtm/544701/544701.csproj6
-rw-r--r--tests/src/GC/Regressions/v2.0-rtm/544701/project.json34
-rw-r--r--tests/src/GC/Scenarios/Affinity/affinitizer.cs129
-rw-r--r--tests/src/GC/Scenarios/Affinity/affinitizer.csproj46
-rw-r--r--tests/src/GC/Scenarios/Affinity/app.config31
-rw-r--r--tests/src/GC/Scenarios/BaseFinal/app.config31
-rw-r--r--tests/src/GC/Scenarios/BaseFinal/basefinal.cs143
-rw-r--r--tests/src/GC/Scenarios/BaseFinal/basefinal.csproj45
-rw-r--r--tests/src/GC/Scenarios/BinTree/app.config31
-rw-r--r--tests/src/GC/Scenarios/BinTree/bintree.cs181
-rw-r--r--tests/src/GC/Scenarios/BinTree/bintree.csproj47
-rw-r--r--tests/src/GC/Scenarios/BinTree/thdtree.cs50
-rw-r--r--tests/src/GC/Scenarios/BinTree/thdtree.csproj48
-rw-r--r--tests/src/GC/Scenarios/BinTree/thdtreegrowingobj.cs50
-rw-r--r--tests/src/GC/Scenarios/BinTree/thdtreegrowingobj.csproj48
-rw-r--r--tests/src/GC/Scenarios/BinTree/thdtreelivingobj.cs49
-rw-r--r--tests/src/GC/Scenarios/BinTree/thdtreelivingobj.csproj48
-rw-r--r--tests/src/GC/Scenarios/BinTree/treethread.cs50
-rw-r--r--tests/src/GC/Scenarios/Boxing/arrcpy.cs58
-rw-r--r--tests/src/GC/Scenarios/Boxing/arrcpy.csproj45
-rw-r--r--tests/src/GC/Scenarios/Boxing/doubLink.csproj6
-rw-r--r--tests/src/GC/Scenarios/Boxing/gcvariant.cs205
-rw-r--r--tests/src/GC/Scenarios/Boxing/gcvariant.csproj45
-rw-r--r--tests/src/GC/Scenarios/Boxing/gcvariant2.cs112
-rw-r--r--tests/src/GC/Scenarios/Boxing/gcvariant2.csproj45
-rw-r--r--tests/src/GC/Scenarios/Boxing/gcvariant3.cs156
-rw-r--r--tests/src/GC/Scenarios/Boxing/gcvariant3.csproj45
-rw-r--r--tests/src/GC/Scenarios/Boxing/gcvariant4.cs142
-rw-r--r--tests/src/GC/Scenarios/Boxing/gcvariant4.csproj45
-rw-r--r--tests/src/GC/Scenarios/Boxing/project.json34
-rw-r--r--tests/src/GC/Scenarios/Boxing/simpvariant.cs97
-rw-r--r--tests/src/GC/Scenarios/Boxing/simpvariant.csproj45
-rw-r--r--tests/src/GC/Scenarios/Boxing/vararystress.cs75
-rw-r--r--tests/src/GC/Scenarios/Boxing/vararystress.csproj45
-rw-r--r--tests/src/GC/Scenarios/Boxing/variantint.cs94
-rw-r--r--tests/src/GC/Scenarios/Boxing/variantint.csproj45
-rw-r--r--tests/src/GC/Scenarios/Boxing/variantlinklist.cs106
-rw-r--r--tests/src/GC/Scenarios/Boxing/variantlinklist.csproj45
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/DoubLink.csproj6
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/DoubLink_V2.csproj6
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/dlbigleak.cs199
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/dlbigleak.csproj45
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.cs149
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.csproj48
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/dlbigleakthd_v2.csproj48
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/dlcollect.cs104
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/dlcollect.csproj48
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/dlstack.cs120
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/dlstack.csproj48
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/doublinkgen.cs179
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/doublinkgen.csproj45
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/doublinknoleak.cs95
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/doublinknoleak.csproj48
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/doublinknoleak2.cs209
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/doublinknoleak2.csproj45
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/doublinkstay.cs194
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/doublinkstay.csproj45
-rw-r--r--tests/src/GC/Scenarios/DoublinkList/project.json34
-rw-r--r--tests/src/GC/Scenarios/Dynamo/app.config31
-rw-r--r--tests/src/GC/Scenarios/Dynamo/basenode.cs30
-rw-r--r--tests/src/GC/Scenarios/Dynamo/dynamo.cs303
-rw-r--r--tests/src/GC/Scenarios/Dynamo/dynamo.csproj50
-rw-r--r--tests/src/GC/Scenarios/Dynamo/dynamonode.cs48
-rw-r--r--tests/src/GC/Scenarios/Dynamo/randomnode.cs35
-rw-r--r--tests/src/GC/Scenarios/Dynamo/staticnode.cs41
-rw-r--r--tests/src/GC/Scenarios/FinalNStruct/finalnstruct.cs68
-rw-r--r--tests/src/GC/Scenarios/FinalNStruct/finalnstruct.csproj48
-rw-r--r--tests/src/GC/Scenarios/FinalNStruct/nstructresur.cs63
-rw-r--r--tests/src/GC/Scenarios/FinalNStruct/nstructresur.csproj48
-rw-r--r--tests/src/GC/Scenarios/FinalNStruct/nstructtun.cs74
-rw-r--r--tests/src/GC/Scenarios/FinalNStruct/nstructtun.csproj48
-rw-r--r--tests/src/GC/Scenarios/FinalNStruct/project.json34
-rw-r--r--tests/src/GC/Scenarios/FinalNStruct/strmap.csproj6
-rw-r--r--tests/src/GC/Scenarios/FinalizeTimeout/FinalizeTimeout.csproj8
-rw-r--r--tests/src/GC/Scenarios/FinalizeTimeout/project.json34
-rw-r--r--tests/src/GC/Scenarios/FragMan/app.config31
-rw-r--r--tests/src/GC/Scenarios/FragMan/fragman.cs311
-rw-r--r--tests/src/GC/Scenarios/FragMan/fragman.csproj45
-rw-r--r--tests/src/GC/Scenarios/GCBase1/app.config31
-rw-r--r--tests/src/GC/Scenarios/GCBase1/gc_base1.cs171
-rw-r--r--tests/src/GC/Scenarios/GCBase1/gc_base1.csproj46
-rw-r--r--tests/src/GC/Scenarios/GCBase1/gc_base1_1.csproj46
-rw-r--r--tests/src/GC/Scenarios/GCBench/app.config31
-rw-r--r--tests/src/GC/Scenarios/GCBench/gcbench.cs171
-rw-r--r--tests/src/GC/Scenarios/GCBench/gcbench.csproj45
-rw-r--r--tests/src/GC/Scenarios/GCStress/app.config31
-rw-r--r--tests/src/GC/Scenarios/GCStress/gcstress.cs75
-rw-r--r--tests/src/GC/Scenarios/GCStress/gcstress.csproj45
-rw-r--r--tests/src/GC/Scenarios/LeakGen/app.config31
-rw-r--r--tests/src/GC/Scenarios/LeakGen/leakgen.cs110
-rw-r--r--tests/src/GC/Scenarios/LeakGen/leakgen.csproj45
-rw-r--r--tests/src/GC/Scenarios/LeakGen/leakgenthrd.cs131
-rw-r--r--tests/src/GC/Scenarios/LeakGen/leakgenthrd.csproj45
-rw-r--r--tests/src/GC/Scenarios/LeakWheel/app.config31
-rw-r--r--tests/src/GC/Scenarios/LeakWheel/leakwheel.cs542
-rw-r--r--tests/src/GC/Scenarios/LeakWheel/leakwheel.csproj45
-rw-r--r--tests/src/GC/Scenarios/MinLeakGen/app.config31
-rw-r--r--tests/src/GC/Scenarios/MinLeakGen/minleakgen.cs100
-rw-r--r--tests/src/GC/Scenarios/MinLeakGen/minleakgen.csproj45
-rw-r--r--tests/src/GC/Scenarios/NDPin/app.config31
-rw-r--r--tests/src/GC/Scenarios/NDPin/ndpin.cs53
-rw-r--r--tests/src/GC/Scenarios/NDPin/ndpin.csproj45
-rw-r--r--tests/src/GC/Scenarios/NDPin/ndpinfinal.cs125
-rw-r--r--tests/src/GC/Scenarios/NDPin/ndpinfinal.csproj45
-rw-r--r--tests/src/GC/Scenarios/RanCollect/app.config31
-rw-r--r--tests/src/GC/Scenarios/RanCollect/rancollect.cs377
-rw-r--r--tests/src/GC/Scenarios/RanCollect/rancollect.csproj46
-rw-r--r--tests/src/GC/Scenarios/ReflectObj/app.config31
-rw-r--r--tests/src/GC/Scenarios/ReflectObj/reflectobj.cs132
-rw-r--r--tests/src/GC/Scenarios/ReflectObj/reflectobj.csproj45
-rw-r--r--tests/src/GC/Scenarios/Resurrection/app.config31
-rw-r--r--tests/src/GC/Scenarios/Resurrection/continue.cs139
-rw-r--r--tests/src/GC/Scenarios/Resurrection/continue.csproj45
-rw-r--r--tests/src/GC/Scenarios/Rootmem/app.config31
-rw-r--r--tests/src/GC/Scenarios/Rootmem/rootmem.cs91
-rw-r--r--tests/src/GC/Scenarios/Rootmem/rootmem.csproj45
-rw-r--r--tests/src/GC/Scenarios/Samples/app.config31
-rw-r--r--tests/src/GC/Scenarios/Samples/gc.cs532
-rw-r--r--tests/src/GC/Scenarios/Samples/gc.csproj45
-rw-r--r--tests/src/GC/Scenarios/ServerModel/app.config31
-rw-r--r--tests/src/GC/Scenarios/ServerModel/cache.cs87
-rw-r--r--tests/src/GC/Scenarios/ServerModel/parameters.cs421
-rw-r--r--tests/src/GC/Scenarios/ServerModel/request.cs95
-rw-r--r--tests/src/GC/Scenarios/ServerModel/server.cs109
-rw-r--r--tests/src/GC/Scenarios/ServerModel/servermodel.cs81
-rw-r--r--tests/src/GC/Scenarios/ServerModel/servermodel.csproj51
-rw-r--r--tests/src/GC/Scenarios/ServerModel/settings.cs87
-rw-r--r--tests/src/GC/Scenarios/SingLinkList/app.config31
-rw-r--r--tests/src/GC/Scenarios/SingLinkList/singlinkgen.cs149
-rw-r--r--tests/src/GC/Scenarios/SingLinkList/singlinkgen.csproj45
-rw-r--r--tests/src/GC/Scenarios/SingLinkList/singlinkstay.cs150
-rw-r--r--tests/src/GC/Scenarios/SingLinkList/singlinkstay.csproj45
-rw-r--r--tests/src/GC/Scenarios/StringCreator/app.config31
-rw-r--r--tests/src/GC/Scenarios/StringCreator/stringcreator.cs103
-rw-r--r--tests/src/GC/Scenarios/StringCreator/stringcreator.csproj45
-rw-r--r--tests/src/GC/Scenarios/THDChaos/app.config31
-rw-r--r--tests/src/GC/Scenarios/THDChaos/livingobject.cs67
-rw-r--r--tests/src/GC/Scenarios/THDChaos/masterthread.cs44
-rw-r--r--tests/src/GC/Scenarios/THDChaos/thdchaos.cs44
-rw-r--r--tests/src/GC/Scenarios/THDChaos/thdchaos.csproj47
-rw-r--r--tests/src/GC/Scenarios/THDList/app.config31
-rw-r--r--tests/src/GC/Scenarios/THDList/linkedlist.cs91
-rw-r--r--tests/src/GC/Scenarios/THDList/llthread.cs47
-rw-r--r--tests/src/GC/Scenarios/THDList/thdlist.cs53
-rw-r--r--tests/src/GC/Scenarios/THDList/thdlist.csproj47
-rw-r--r--tests/src/GC/Scenarios/WeakReference/app.config31
-rw-r--r--tests/src/GC/Scenarios/WeakReference/getgencollect.cs81
-rw-r--r--tests/src/GC/Scenarios/WeakReference/getgencollect.csproj45
-rw-r--r--tests/src/GC/Scenarios/WeakReference/weakref.cs165
-rw-r--r--tests/src/GC/Scenarios/WeakReference/weakref.csproj45
-rw-r--r--tests/src/GC/Scenarios/WeakReference/weakreffinal.cs182
-rw-r--r--tests/src/GC/Scenarios/WeakReference/weakreffinal.csproj45
-rw-r--r--tests/src/GC/Scenarios/muldimjagary/app.config31
-rw-r--r--tests/src/GC/Scenarios/muldimjagary/muldimjagary.cs181
-rw-r--r--tests/src/GC/Scenarios/muldimjagary/muldimjagary.csproj45
-rw-r--r--tests/src/GC/config/extra/project.json (renamed from tests/src/GC/Coverage/project.json)5
-rw-r--r--tests/src/GC/config/minimal/project.json (renamed from tests/src/GC/API/GCSettings/project.json)4
-rw-r--r--tests/src/GC/dir.props7
-rw-r--r--tests/testsFailingOutsideWindows.txt35
-rw-r--r--tests/testsUnsupportedOutsideWindows.txt1
-rw-r--r--tests/x86_legacy_backend_issues.targets122
472 files changed, 33073 insertions, 519 deletions
diff --git a/tests/issues.targets b/tests/issues.targets
index c0d217be8b..308c93b26b 100644
--- a/tests/issues.targets
+++ b/tests/issues.targets
@@ -318,6 +318,111 @@
</ExcludeList>
<ExcludeList Include="$(XunitTestBinBase)\Interop\BestFitMapping\BestFitMapping\BestFitMapping.cmd" >
<Issue>3571</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\API\WeakReference\Finalize2\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\API\WeakReference\NullHandle\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\API\WeakReference\Target\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\API\WeakReference\IsAlive\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\API\WeakReference\IsAlive_neg\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\Finalizer\finalizeother\finalizedirectedgraph\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\Allocation\finalizertest\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\Allocation\finalizertest\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\API\gc\reregisterforfinalize\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\API\gc\collect\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\DoublinkList\doublinknoleak2\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\DoublinkList\doublinknoleak\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\LeakWheel\leakwheel\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\SingLinkList\singlinkgen\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\WeakReference\getgencollect\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\WeakReference\weakref\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\API\gc\getgeneration\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\BaseFinal\basefinal\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Coverage\concurrentspin2\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Coverage\smalloom\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Coverage\271010\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\BackgroundGC\concurrentspin2\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\BackgroundGC\foregroundgc\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\LOHCompaction\lohcompact_stress\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\LOHCompaction\lohcompactscenariorepro\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\LOHCompaction\lohcompactapi2\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\LOHFragmentation\lohfragmentation\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\PartialCompaction\partialcompactiontest\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\PartialCompaction\partialcompactionwloh\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\PartialCompaction\eco1\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\SustainedLowLatency\sustainedlowlatency_race_reverse\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\SustainedLowLatency\scenario\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\SustainedLowLatency\sustainedlowlatency_race\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Regressions\dev10bugs\536168\536168\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\muldimjagary\muldimjagary\*">
+ <Issue>3392</Issue>
</ExcludeList>
</ItemGroup>
</Project>
diff --git a/tests/src/GC/API/GC/AddMemoryPressureTest.cs b/tests/src/GC/API/GC/AddMemoryPressureTest.cs
new file mode 100644
index 0000000000..52b98eb7f0
--- /dev/null
+++ b/tests/src/GC/API/GC/AddMemoryPressureTest.cs
@@ -0,0 +1,210 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/* AddMemoryPressureTest
+ *
+ * Tests GC.AddMemoryPressure by passing it values that are too small (<=0) and
+ * values that are too large (>Int32.MaxValue on 32-bit).
+ * The stress test doubles the pressure (2xInt32.MaxValue), and verifies
+ * valid behaviour.
+ */
+
+
+
+
+using System;
+using System.Diagnostics;
+using System.Security;
+using System.Runtime.InteropServices;
+
+public class Dummy
+{
+ private long _pressure = 0;
+ private int _numTimes = 0;
+
+ public Dummy(bool heavy)
+ {
+ if (heavy)
+ {
+ _pressure = Int32.MaxValue;
+ _numTimes = 2;
+ for (int i = 0; i < _numTimes; i++)
+ GC.AddMemoryPressure(_pressure);
+ }
+ }
+
+ ~Dummy()
+ {
+ for (int i = 0; i < _numTimes; i++)
+ GC.RemoveMemoryPressure(_pressure);
+ }
+}
+
+public class AddMemoryPressureTest
+{
+ public int TestCount = 0;
+
+ private long[] _negValues = { 0, -1, Int32.MinValue - (long)1, Int64.MinValue / (long)2, Int64.MinValue };
+ private long[] _largeValues = { Int32.MaxValue + (long)1, Int64.MaxValue };
+
+
+ private AddMemoryPressureTest()
+ {
+ }
+
+
+ public bool TooSmallTest()
+ {
+ TestCount++;
+ bool retVal = true;
+
+ foreach (long i in _negValues)
+ {
+ try
+ {
+ GC.AddMemoryPressure(i);
+ Console.WriteLine("Failure at TooSmallTest: {0}", i);
+ retVal = false;
+ break;
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ Console.WriteLine("Failure at TooSmallTest: {0}", i);
+ retVal = false;
+ break;
+ }
+ }
+
+ if (retVal)
+ Console.WriteLine("TooSmallTest Passed");
+ return retVal;
+ }
+
+
+ public bool TooLargeTest()
+ {
+ TestCount++;
+
+ bool retVal = true;
+
+ foreach (long i in _largeValues)
+ {
+ try
+ {
+ GC.AddMemoryPressure(i);
+ // this should not throw exception on 64-bit
+ if (IntPtr.Size == Marshal.SizeOf(new Int32()))
+ {
+ Console.WriteLine("Failure at LargeValueTest: {0}", i);
+ retVal = false;
+ break;
+ }
+ else
+ {
+ GC.RemoveMemoryPressure(i);
+ }
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ // this should not throw exception on 64-bit
+ if (IntPtr.Size == Marshal.SizeOf(new Int64()))
+ {
+ Console.WriteLine("Failure at LargeValueTest: {0}", i);
+ retVal = false;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ retVal = false;
+ break;
+ }
+ }
+
+ if (retVal)
+ Console.WriteLine("TooLargeTest Passed");
+ return retVal;
+ }
+
+
+ public bool StressTest()
+ {
+ TestCount++;
+
+ Console.WriteLine("StressTest Started...");
+
+ int gcCount1 = createDummies(true);
+
+
+ int gcCount2 = createDummies(false);
+
+ Console.WriteLine("{0} {1}", gcCount1, gcCount2);
+ if (gcCount1 > gcCount2)
+ {
+ Console.WriteLine("StressTest Passed");
+ Console.WriteLine();
+ return true;
+ }
+
+ Console.WriteLine("StressTest Failed");
+
+ Console.WriteLine();
+ return false;
+ }
+
+
+ private int createDummies(bool heavy)
+ {
+ int gcCount = GC.CollectionCount(0);
+
+ for (int i = 0; i < 100; i++)
+ {
+ Dummy dummy = new Dummy(heavy);
+ int gen = GC.GetGeneration(dummy);
+ if (gen != 0)
+ {
+ Console.WriteLine("Warning: newly-allocated dummy ended up in gen {0}", gen);
+ }
+ }
+
+ return GC.CollectionCount(0) - gcCount;
+ }
+
+
+ public bool RunTest()
+ {
+ int passCount = 0;
+
+ if (TooSmallTest())
+ passCount++;
+
+ if (TooLargeTest())
+ passCount++;
+
+ if (StressTest())
+ passCount++;
+
+ return (passCount == TestCount);
+ }
+
+
+ public static int Main()
+ {
+ AddMemoryPressureTest test = new AddMemoryPressureTest();
+
+ if (test.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GC/AddMemoryPressureTest.csproj b/tests/src/GC/API/GC/AddMemoryPressureTest.csproj
new file mode 100644
index 0000000000..75a51ece96
--- /dev/null
+++ b/tests/src/GC/API/GC/AddMemoryPressureTest.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="AddMemoryPressureTest.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/AddThresholdTest.cs b/tests/src/GC/API/GC/AddThresholdTest.cs
new file mode 100644
index 0000000000..d495d6abcc
--- /dev/null
+++ b/tests/src/GC/API/GC/AddThresholdTest.cs
@@ -0,0 +1,110 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/* AddUsageTest
+ *
+ * Tests GC.AddMemoryPressure by passing a valid value (AddMemoryPressureTest.Pressure)
+ * and making sure the objects with added pressure get collected more times by
+ * the GC than those without pressure.
+ */
+
+
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+public class Dummy
+{
+ public Dummy(long pressure)
+ {
+ GC.AddMemoryPressure(pressure);
+ }
+
+ public Dummy()
+ {
+ }
+}
+
+
+
+public class AddUsageTest
+{
+ public static int Pressure = 100000; // test will fail with values less than this
+ private int _numTests = 0;
+
+
+ private AddUsageTest()
+ {
+ }
+
+
+ public bool ThresholdTest()
+ {
+ _numTests++;
+
+ int gcCount1 = GC.CollectionCount(0);
+ for (int i = 0; i < 100; i++)
+ {
+ Dummy heavy = new Dummy(AddUsageTest.Pressure);
+ int gen = GC.GetGeneration(heavy);
+ if (gen != 0)
+ {
+ Console.WriteLine("Warning: newly-allocated dummy ended up in gen {0}", gen);
+ }
+ //GC.WaitForPendingFinalizers();
+ }
+ gcCount1 = GC.CollectionCount(0) - gcCount1;
+
+
+ int gcCount2 = GC.CollectionCount(0);
+ for (int i = 0; i < 100; i++)
+ {
+ Dummy light = new Dummy(AddUsageTest.Pressure);
+ int gen = GC.GetGeneration(light);
+ if (gen != 0)
+ {
+ Console.WriteLine("Warning: newly-allocated dummy ended up in gen {0}", gen);
+ }
+ //GC.WaitForPendingFinalizers();
+ }
+ gcCount2 = GC.CollectionCount(0) - gcCount2;
+
+ Console.WriteLine("{0} {1}", gcCount1, gcCount2);
+ if (gcCount1 > gcCount2)
+ {
+ Console.WriteLine("ThresholdTest Passed");
+ Console.WriteLine();
+ return true;
+ }
+
+ Console.WriteLine("ThresholdTest Failed");
+ Console.WriteLine();
+ return false;
+ }
+
+
+ public bool RunTest()
+ {
+ int numPass = 0;
+
+ if (ThresholdTest())
+ numPass++;
+
+ return (numPass == _numTests);
+ }
+
+ public static int Main()
+ {
+ AddUsageTest test = new AddUsageTest();
+
+ if (test.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GC/AddThresholdTest.csproj b/tests/src/GC/API/GC/AddThresholdTest.csproj
new file mode 100644
index 0000000000..d98edd8776
--- /dev/null
+++ b/tests/src/GC/API/GC/AddThresholdTest.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="AddThresholdTest.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/AddUsageTest.cs b/tests/src/GC/API/GC/AddUsageTest.cs
new file mode 100644
index 0000000000..f3ac783c6e
--- /dev/null
+++ b/tests/src/GC/API/GC/AddUsageTest.cs
@@ -0,0 +1,112 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/* AddUsageTest
+ *
+ * Tests GC.AddMemoryPressure by passing a valid value (AddMemoryPressureTest.Pressure)
+ * and making sure the objects with added pressure get collected more times by
+ * the GC than those without pressure.
+ */
+
+
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+public class Dummy
+{
+ public Dummy(long pressure)
+ {
+ GC.AddMemoryPressure(pressure);
+ }
+
+ public Dummy()
+ {
+ }
+}
+
+
+
+public class AddUsageTest
+{
+ public static int Pressure = 100000; // test will fail with values less than this
+ private int _numTests = 0;
+
+
+ private AddUsageTest()
+ {
+ }
+
+
+
+
+ public bool AddTest()
+ {
+ _numTests++;
+
+ int gcCount1 = GC.CollectionCount(0);
+ for (int i = 0; i < 100; i++)
+ {
+ Dummy heavy = new Dummy(AddUsageTest.Pressure);
+ int gen = GC.GetGeneration(heavy);
+ if (gen != 0)
+ {
+ Console.WriteLine("Warning: newly-allocated dummy ended up in gen {0}", gen);
+ }
+ //GC.WaitForPendingFinalizers();
+ }
+ gcCount1 = GC.CollectionCount(0) - gcCount1;
+
+
+ int gcCount2 = GC.CollectionCount(0);
+ for (int i = 0; i < 100; i++)
+ {
+ Dummy light = new Dummy();
+ int gen = GC.GetGeneration(light);
+ if (gen != 0)
+ {
+ Console.WriteLine("Warning: newly-allocated dummy ended up in gen {0}", gen);
+ }
+ //GC.WaitForPendingFinalizers();
+ }
+ gcCount2 = GC.CollectionCount(0) - gcCount2;
+
+ Console.WriteLine("{0} {1}", gcCount1, gcCount2);
+ if (gcCount1 > gcCount2)
+ {
+ Console.WriteLine("AddTest Passed");
+ Console.WriteLine();
+ return true;
+ }
+
+ Console.WriteLine("AddTest Failed");
+ Console.WriteLine();
+ return false;
+ }
+
+ public bool RunTest()
+ {
+ int numPass = 0;
+
+
+ if (AddTest())
+ numPass++;
+
+ return (numPass == _numTests);
+ }
+
+ public static int Main()
+ {
+ AddUsageTest test = new AddUsageTest();
+
+ if (test.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GC/AddUsageTest.csproj b/tests/src/GC/API/GC/AddUsageTest.csproj
new file mode 100644
index 0000000000..ddf2da2672
--- /dev/null
+++ b/tests/src/GC/API/GC/AddUsageTest.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="AddUsageTest.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect.cs b/tests/src/GC/API/GC/Collect.cs
new file mode 100644
index 0000000000..0c4931beb3
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect.cs
@@ -0,0 +1,32 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+// Tests GC.Collect()
+
+using System;
+
+public class Test {
+ public static int Main() {
+
+ Object obj1 = new Object();
+ int[] array = new int[25];
+
+ int gen1 = GC.GetGeneration(array);
+
+ Console.WriteLine("Array is in generation: " + gen1);
+ GC.Collect();
+
+ int gen2 = GC.GetGeneration(array);
+ Console.WriteLine("Array is in generation: " + gen2);
+
+ if(((gen1==2) && (gen2==2)) || (gen2>gen1)) { // was already in gen 2!
+ Console.WriteLine("Test for GC.Collect() passed!");
+ return 100;
+ }
+
+ else {
+ Console.WriteLine("Test for GC.Collect() failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GC/Collect.csproj b/tests/src/GC/API/GC/Collect.csproj
new file mode 100644
index 0000000000..9b4da631d6
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect0.cs b/tests/src/GC/API/GC/Collect0.cs
new file mode 100644
index 0000000000..5d5d54b4da
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect0.cs
@@ -0,0 +1,52 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+// Tests GC.Collect(0)
+
+using System;
+
+public class Test {
+ public static int Main() {
+
+ int[] array = new int[25];
+ int agen1 = GC.GetGeneration(array);
+
+ Console.WriteLine("Array is in generation: " + agen1);
+
+ if(agen1 != 0) {
+ Console.WriteLine("Running under stress..");
+ return 100;
+ }
+
+ //GC.Collect();
+
+ Object obj = new Object();
+ int ogen1 = GC.GetGeneration(obj);
+
+ Console.WriteLine("Object is in generation: " + ogen1);
+ Console.WriteLine("Collect(0)");
+ GC.Collect(0);
+ GC.Collect(0);
+
+ int agen2 = GC.GetGeneration(array);
+ int ogen2 = GC.GetGeneration(obj);
+
+ if(agen2 > 1) {
+ Console.WriteLine("Running under stress..");
+ return 100;
+ }
+
+ Console.WriteLine("Array is in generation: {0}",agen2);
+ Console.WriteLine("Object is in generation: {0}",ogen2);
+
+ if(agen2 == ogen2) { // only gen 0 was collected
+ Console.WriteLine("Test for GC.Collect(0) passed!");
+ return 100;
+ }
+
+ else {
+ Console.WriteLine("Test for GC.Collect(0) failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GC/Collect0.csproj b/tests/src/GC/API/GC/Collect0.csproj
new file mode 100644
index 0000000000..3b742e4667
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect0.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect0.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect1.cs b/tests/src/GC/API/GC/Collect1.cs
new file mode 100644
index 0000000000..689f055c55
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect1.cs
@@ -0,0 +1,49 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GC.Collect(1)
+
+using System;
+
+public class Test
+{
+ public static int Main()
+ {
+ int[] array = new int[25];
+ int agen1 = GC.GetGeneration(array);
+ Console.WriteLine("Array is in generation: " + agen1);
+
+ GC.Collect();
+
+ Object obj = new Object();
+ int ogen1 = GC.GetGeneration(obj);
+ Console.WriteLine("Object is in generation: " + ogen1);
+
+ Console.WriteLine("Collect(1)");
+ GC.Collect(1);
+
+ int agen2 = GC.GetGeneration(array);
+ int ogen2 = GC.GetGeneration(obj);
+
+ Console.WriteLine("Array is in generation: {0}", agen2);
+ Console.WriteLine("Object is in generation: {0}", ogen2);
+
+ if (agen2 > ogen2)
+ { // gen 0,1 collected
+ Console.WriteLine("Test for GC.Collect(1) passed!");
+ return 100;
+ }
+ else if (agen2 == ogen2 && agen2 == GC.MaxGeneration)
+ {
+ // both got collected, possibly because of GC Stress
+ Console.WriteLine("Test for GC.Collect(1) passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for GC.Collect(1) failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GC/Collect1.csproj b/tests/src/GC/API/GC/Collect1.csproj
new file mode 100644
index 0000000000..012b0e3aa1
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect1.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect1.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect_Default.cs b/tests/src/GC/API/GC/Collect_Default.cs
new file mode 100644
index 0000000000..e380b9abdb
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_Default.cs
@@ -0,0 +1,48 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Diagnostics;
+
+public class DefaultCollect
+{
+ public static void Usage()
+ {
+ Console.WriteLine("Usage:");
+ Console.WriteLine("{0} <0|1|2>", Process.GetCurrentProcess().ProcessName);
+ }
+
+ public static int Main(string[] args )
+ {
+
+ int gen = -1;
+ if ( (args.Length!=1) || (!Int32.TryParse(args[0], out gen)) )
+ {
+ Usage();
+ return 0;
+ }
+
+ if ( (gen < 0) || (gen>2) )
+ {
+ Usage();
+ return 0;
+ }
+
+ byte[] b = new byte[1024*1024*10];
+ int oldCollectionCount = GC.CollectionCount(gen);
+ b = null;
+
+ GC.Collect(gen, GCCollectionMode.Default);
+
+ if (GC.CollectionCount(gen)>oldCollectionCount)
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+
+ }
+}
diff --git a/tests/src/GC/API/GC/Collect_Default_1.csproj b/tests/src/GC/API/GC/Collect_Default_1.csproj
new file mode 100644
index 0000000000..8ab65bc4f0
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_Default_1.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>0</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect_Default.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect_Default_2.csproj b/tests/src/GC/API/GC/Collect_Default_2.csproj
new file mode 100644
index 0000000000..3b846aad71
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_Default_2.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>1</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect_Default.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect_Default_3.csproj b/tests/src/GC/API/GC/Collect_Default_3.csproj
new file mode 100644
index 0000000000..4cca06babd
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_Default_3.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect_Default.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect_Forced.cs b/tests/src/GC/API/GC/Collect_Forced.cs
new file mode 100644
index 0000000000..99137d574e
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_Forced.cs
@@ -0,0 +1,51 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Diagnostics;
+
+public class DefaultCollect
+{
+ static string ProcessName;
+
+ public static void Usage()
+ {
+ Console.WriteLine("Usage:");
+ Console.WriteLine("{0} <0|1|2>", ProcessName);
+ }
+
+ public static int Main(string[] args )
+ {
+
+ ProcessName = Process.GetCurrentProcess().ProcessName;
+ int gen = -1;
+ if ( (args.Length!=1) || (!Int32.TryParse(args[0], out gen)) )
+ {
+ Usage();
+ return 0;
+ }
+
+ if ( (gen < 0) || (gen>2) )
+ {
+ Usage();
+ return 0;
+ }
+
+ byte[] b = new byte[1024*1024*10];
+ int oldCollectionCount = GC.CollectionCount(gen);
+ b = null;
+
+ GC.Collect(gen, GCCollectionMode.Forced);
+
+ if (GC.CollectionCount(gen)>oldCollectionCount)
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+
+ }
+}
diff --git a/tests/src/GC/API/GC/Collect_Forced_1.csproj b/tests/src/GC/API/GC/Collect_Forced_1.csproj
new file mode 100644
index 0000000000..3f3773c252
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_Forced_1.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>0</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect_Forced.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect_Forced_2.csproj b/tests/src/GC/API/GC/Collect_Forced_2.csproj
new file mode 100644
index 0000000000..68561ae58a
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_Forced_2.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>1</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect_Forced.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect_Forced_3.csproj b/tests/src/GC/API/GC/Collect_Forced_3.csproj
new file mode 100644
index 0000000000..c9250a5970
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_Forced_3.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect_Forced.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect_Optimized.cs b/tests/src/GC/API/GC/Collect_Optimized.cs
new file mode 100644
index 0000000000..289360be9a
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_Optimized.cs
@@ -0,0 +1,69 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.IO;
+using System.Runtime;
+using System.Collections.Generic;
+using System.Diagnostics;
+
+public class OptimizedCollect
+{
+
+ public static void Usage()
+ {
+ Console.WriteLine("Usage:");
+ Console.WriteLine("{0} <0|1|2>", Process.GetCurrentProcess().ProcessName);
+ }
+
+ protected List<byte[]> b;
+ protected int collectionCount;
+ protected int newCollectionCount;
+
+
+ public void PreTest()
+ {
+ b = new List<byte[]>();
+ collectionCount = 0;
+ }
+
+ public void RunTest(int gen)
+ {
+
+ newCollectionCount = collectionCount = GC.CollectionCount(gen);
+ while (collectionCount == newCollectionCount)
+ {
+ b.Add(new byte[1024]);
+ GC.Collect(gen, GCCollectionMode.Optimized);
+ newCollectionCount = GC.CollectionCount(gen);
+ }
+
+ }
+
+
+ public static int Main(string[] args )
+ {
+
+ int gen = -1;
+ if ( (args.Length!=1) || (!Int32.TryParse(args[0], out gen)) )
+ {
+ Usage();
+ return 0;
+ }
+
+ if ( (gen < 0) || (gen>2) )
+ {
+ Usage();
+ return 0;
+ }
+
+ OptimizedCollect test = new OptimizedCollect();
+ test.PreTest();
+ test.RunTest(gen);
+
+ return 100;
+ }
+
+
+}
diff --git a/tests/src/GC/API/GC/Collect_Optimized_1.csproj b/tests/src/GC/API/GC/Collect_Optimized_1.csproj
new file mode 100644
index 0000000000..fde633ea53
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_Optimized_1.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>0</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect_Optimized.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect_Optimized_2.csproj b/tests/src/GC/API/GC/Collect_Optimized_2.csproj
new file mode 100644
index 0000000000..e2dcee97bc
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_Optimized_2.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>1</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect_Optimized.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect_Optimized_3.csproj b/tests/src/GC/API/GC/Collect_Optimized_3.csproj
new file mode 100644
index 0000000000..6643314ba1
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_Optimized_3.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect_Optimized.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect_fail.cs b/tests/src/GC/API/GC/Collect_fail.cs
new file mode 100644
index 0000000000..6d04f18136
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_fail.cs
@@ -0,0 +1,58 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*
+ * Tests GC.Collect(n), where n = -1...MaxGeneration+10
+ * An exception should be thrown for -1, but no other value
+ *
+ * Notes:
+ * -passes with complus_jitminops
+ * -passes with debug
+ * -passes with complus_gcstress
+ */
+
+using System;
+
+public class Test
+{
+ public static int Main()
+ {
+ int[] array = new int[25];
+ bool passed = false;
+
+ try
+ {
+ GC.Collect(-1);
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ // Should throw exception
+ passed = true;
+ }
+
+ if (!passed)
+ {
+ // Exception not thrown
+ Console.WriteLine("Test for GC.Collect(-1) failed: ArgumentOutOfRangeException not thrown!");
+ return 1;
+ }
+
+ for (int i = 0; i <= GC.MaxGeneration + 10; i++)
+ {
+ try
+ {
+ GC.Collect(i); // Should not throw exception!
+ }
+ catch (ArgumentOutOfRangeException e)
+ {
+ // Exception thrown
+ Console.WriteLine("Test for GC.Collect({0}) failed: {1}", i, e.Message);
+ return 1;
+ }
+ }
+
+ Console.WriteLine("Test for GC.Collect() passed!");
+ return 100;
+ }
+}
diff --git a/tests/src/GC/API/GC/Collect_fail.csproj b/tests/src/GC/API/GC/Collect_fail.csproj
new file mode 100644
index 0000000000..92d97116ad
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_fail.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect_fail.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Collect_neg.cs b/tests/src/GC/API/GC/Collect_neg.cs
new file mode 100644
index 0000000000..717d2c6213
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_neg.cs
@@ -0,0 +1,36 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+public class NegCollect
+{
+ public static int Main()
+ {
+ bool retVal = true;
+ GCCollectionMode[] invalidInputs = { (GCCollectionMode)(GCCollectionMode.Default - 1), (GCCollectionMode)(GCCollectionMode.Optimized + 1) };
+
+ for (int i = 0; i < invalidInputs.Length; i++)
+ {
+ try
+ {
+ GC.Collect(2, invalidInputs[i]);
+ retVal = false;
+ Console.WriteLine("Invalid value for GC.Collect: {0}", invalidInputs[i]);
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ }
+ }
+
+ if (retVal)
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GC/Collect_neg.csproj b/tests/src/GC/API/GC/Collect_neg.csproj
new file mode 100644
index 0000000000..0017924d4a
--- /dev/null
+++ b/tests/src/GC/API/GC/Collect_neg.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Collect_neg.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/CollectionCountTest.cs b/tests/src/GC/API/GC/CollectionCountTest.cs
new file mode 100644
index 0000000000..c231c051cd
--- /dev/null
+++ b/tests/src/GC/API/GC/CollectionCountTest.cs
@@ -0,0 +1,146 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/* CollectionCountTest
+ *
+ * Tests GC.CollectionCount by passing it invalid values (<0) and
+ * values that are too large (>GC.MaxGeneration).
+ * It then tests valid values (0<=x<=GC.MaxGeneration)
+ * by making sure result is at least the number of manual collections
+ * (GC.Collect) per generation (must be at least, since the GC may collect
+ * on it's own).
+ */
+
+using System;
+
+public class CollectionCountTest
+{
+ private const int numTests = 3;
+
+ private Int32[] _negValues = { -1, -10, -10000, Int32.MinValue };
+ private Int32[] _largeValues = { GC.MaxGeneration + 1, Int32.MaxValue / 2, Int32.MaxValue - 1, Int32.MaxValue };
+
+ private CollectionCountTest()
+ {
+ }
+
+ // Checks that CollectionCount correctly counts collections to higher generations
+ public bool CollectionTest()
+ {
+ GC.Collect(2);
+ if (GC.CollectionCount(2) < 1)
+ {
+ Console.WriteLine("Failure at CollectionTest(2)");
+ return false;
+ }
+
+ GC.Collect(1);
+ if (GC.CollectionCount(1) < 2)
+ {
+ Console.WriteLine("Failure at CollectionTest(1)");
+ return false;
+ }
+
+ GC.Collect(0);
+ if (GC.CollectionCount(0) < 3)
+ {
+ Console.WriteLine("Failure at CollectionTest(0)");
+ return false;
+ }
+
+ Console.WriteLine("CollectionTest passed");
+ return true;
+ }
+
+ // Checks that CollectionCount correctly throws an exception on values < 0
+ public bool NegativeTest()
+ {
+ bool retVal = true;
+
+ foreach (int i in _negValues)
+ {
+ try
+ {
+ GC.CollectionCount(i);
+ retVal = false;
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ retVal = false;
+ }
+ if (!retVal)
+ {
+ Console.WriteLine("Failure at NegativeTest");
+ break;
+ }
+ }
+
+ if (retVal)
+ Console.WriteLine("NegativeTest passed");
+ return retVal;
+ }
+
+
+ // Checks that CollectionCount returns 0 when passed 0
+ public bool LargeValuesTest()
+ {
+ bool retVal = true;
+
+ foreach (int i in _largeValues)
+ {
+ try
+ {
+ retVal = (GC.CollectionCount(i) == 0);
+ if (!retVal)
+ {
+ Console.WriteLine("Failure at LargeValueTest: {0}", i);
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ retVal = false;
+ }
+ }
+ if (retVal)
+ Console.WriteLine("LargeValueTest passed");
+ return retVal;
+ }
+
+
+ public bool RunTest()
+ {
+ int passedCount = 0;
+
+ if (NegativeTest())
+ passedCount++;
+ if (LargeValuesTest())
+ passedCount++;
+ if (CollectionTest())
+ passedCount++;
+
+
+ return (passedCount == numTests);
+ }
+
+
+ public static int Main()
+ {
+ CollectionCountTest test = new CollectionCountTest();
+
+ if (test.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GC/CollectionCountTest.csproj b/tests/src/GC/API/GC/CollectionCountTest.csproj
new file mode 100644
index 0000000000..c8501eb116
--- /dev/null
+++ b/tests/src/GC/API/GC/CollectionCountTest.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="CollectionCountTest.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/Finalize.cs b/tests/src/GC/API/GC/Finalize.cs
new file mode 100644
index 0000000000..f4fc9b98f1
--- /dev/null
+++ b/tests/src/GC/API/GC/Finalize.cs
@@ -0,0 +1,57 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests Finalize() and WaitForPendingFinalizers()
+
+using System;
+
+public class Test
+{
+ public static bool visited = false;
+ public class Dummy
+ {
+ ~Dummy()
+ {
+ Console.WriteLine("In Finalize() of Dummy");
+ Test.visited = true;
+ }
+ }
+
+ public class CreateObj
+ {
+ public Dummy obj;
+
+
+ public CreateObj()
+ {
+ obj = new Dummy();
+ }
+
+ public void RunTest()
+ {
+ obj = null;
+ GC.Collect();
+
+ GC.WaitForPendingFinalizers(); // makes sure Finalize() is called.
+ }
+ }
+
+ public static int Main()
+ {
+ CreateObj temp = new CreateObj();
+ temp.RunTest();
+
+
+ if (visited)
+ {
+ Console.WriteLine("Test for Finalize() & WaitForPendingFinalizers() passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for Finalize() & WaitForPendingFinalizers() failed!");
+ return 0;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GC/Finalize.csproj b/tests/src/GC/API/GC/Finalize.csproj
new file mode 100644
index 0000000000..6707308204
--- /dev/null
+++ b/tests/src/GC/API/GC/Finalize.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Finalize.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/GetGeneration.cs b/tests/src/GC/API/GC/GetGeneration.cs
new file mode 100644
index 0000000000..96be043e17
--- /dev/null
+++ b/tests/src/GC/API/GC/GetGeneration.cs
@@ -0,0 +1,135 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GC.GetGeneration
+
+using System;
+
+public class GetGenerationTest
+{
+ private static int s_numTests = 0;
+
+ private bool objectTest()
+ {
+ s_numTests++;
+ Object obj = new Object();
+ int g1 = GC.GetGeneration(obj);
+
+ GC.Collect();
+
+ int g2 = GC.GetGeneration(obj);
+
+ if ((g1 == g2) && (g1 == GC.MaxGeneration))
+ {
+ Console.WriteLine("GCStress is on");
+ Console.WriteLine("ObjectTest Passed!");
+ return true;
+ }
+
+ if (g1 < g2)
+ {
+ Console.WriteLine("ObjectTest Passed!");
+ return true;
+ }
+
+ Console.WriteLine("{0} {1}", g1, g2);
+ Console.WriteLine("ObjectTest Failed!");
+ return false;
+ }
+
+
+ private bool arrayTest()
+ {
+ s_numTests++;
+ int[] arr = new int[25];
+ int g1 = GC.GetGeneration(arr);
+
+ GC.Collect();
+
+ int g2 = GC.GetGeneration(arr);
+
+ if ((g1 == g2) && (g1 == GC.MaxGeneration))
+ {
+ Console.WriteLine("GCStress is on");
+ Console.WriteLine("ObjectTest Passed!");
+ return true;
+ }
+
+ if (g1 < g2)
+ {
+ Console.WriteLine("arrayTest Passed!");
+ return true;
+ }
+
+ Console.WriteLine("{0} {1}", g1, g2);
+ Console.WriteLine("arrayTest Failed!");
+ return false;
+ }
+
+
+ private bool failTest()
+ {
+ s_numTests++;
+
+ Object obj = new Object();
+ obj = null;
+
+ try
+ {
+ GC.GetGeneration(obj);
+ }
+ catch (ArgumentNullException)
+ {
+ Console.WriteLine("failTest Passed!");
+ return true;
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected exception thrown:");
+ Console.WriteLine(e);
+ }
+
+ Console.WriteLine("failTest Failed!");
+ return false;
+ }
+
+
+ public bool RunTests()
+ {
+ int numPassed = 0;
+
+ if (objectTest())
+ numPassed++;
+
+ if (arrayTest())
+ numPassed++;
+
+ if (failTest())
+ numPassed++;
+
+
+ Console.WriteLine();
+ if (s_numTests == numPassed)
+ return true;
+
+ return false;
+ }
+
+
+
+ public static int Main()
+ {
+ GetGenerationTest t = new GetGenerationTest();
+
+ if (t.RunTests())
+ {
+ Console.WriteLine("Test for GetGeneration() passed!");
+ return 100;
+ }
+
+
+ Console.WriteLine("Test for GetGeneration() FAILED!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GC/GetGeneration.csproj b/tests/src/GC/API/GC/GetGeneration.csproj
new file mode 100644
index 0000000000..a264121800
--- /dev/null
+++ b/tests/src/GC/API/GC/GetGeneration.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="GetGeneration.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/GetGenerationWR.cs b/tests/src/GC/API/GC/GetGenerationWR.cs
new file mode 100644
index 0000000000..e33df8ffbf
--- /dev/null
+++ b/tests/src/GC/API/GC/GetGenerationWR.cs
@@ -0,0 +1,68 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+public class Dummy
+{
+ ~Dummy()
+ {
+ Console.WriteLine("In Finalize() of Dummy");
+ }
+}
+
+
+public class CreateObj
+{
+ private Dummy _obj;
+ private WeakReference _weak;
+
+ public CreateObj()
+ {
+ _obj = new Dummy();
+ _weak = new WeakReference(_obj);
+ }
+
+
+ public bool RunTest()
+ {
+ _obj = null;
+ GC.Collect();
+
+ try
+ {
+ GC.GetGeneration(_weak.Target);
+ }
+ catch (ArgumentNullException)
+ {
+ Console.WriteLine("Expected exception");
+ return true;
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected exception: " + e);
+ }
+
+ Console.WriteLine("Expected exception not thrown!");
+ return false;
+ }
+
+
+ public static int Main()
+ {
+ CreateObj temp = new CreateObj();
+
+ if (temp.RunTest())
+ {
+ Console.WriteLine("Test passed!");
+ return 100;
+ }
+
+ Console.WriteLine("Test failed!");
+ return 1;
+ }
+}
+
+
+
diff --git a/tests/src/GC/API/GC/GetGenerationWR.csproj b/tests/src/GC/API/GC/GetGenerationWR.csproj
new file mode 100644
index 0000000000..f05884900e
--- /dev/null
+++ b/tests/src/GC/API/GC/GetGenerationWR.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="GetGenerationWR.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/GetGenerationWR2.cs b/tests/src/GC/API/GC/GetGenerationWR2.cs
new file mode 100644
index 0000000000..159b9270e5
--- /dev/null
+++ b/tests/src/GC/API/GC/GetGenerationWR2.cs
@@ -0,0 +1,58 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/********************************************************************/
+/* Test: GetGeneration
+/* Purpose: Test GC.GetGeneration() works
+/* Note: This test is not an absolute test. If it passes, it doesn't
+/* Gerantee that GetGeneration works fine, because GC.GetGeneration(Object)
+/* and GC.GetGeneration(WeakReference) may break in same way. If it failed,
+/* it needs investigation.
+/********************************************************************/
+
+namespace DefaultNamespace {
+ using System;
+
+ internal class GetGeneration
+ {
+ public static int Main( String [] str )
+ {
+ Console.Out.WriteLine("Test should return with ExitCode 100 ...");
+ Object o = new int[10];
+ WeakReference wf = new WeakReference( o );
+ bool result = false;
+
+ try
+ {
+
+ result = ( GC.GetGeneration( o ) == GC.GetGeneration( wf ));
+
+ GC.KeepAlive(o);
+
+ }
+ catch (ArgumentNullException)
+ {
+ Console.Out.WriteLine( "Caught ArgumentNullException!" );
+ result = false;
+ }
+ catch (Exception e)
+ {
+ Console.Out.WriteLine( "Caught unexpected exception!" );
+ Console.Out.WriteLine(e.Message);
+ result = false;
+ }
+
+
+ if (result)
+ {
+ Console.Out.WriteLine( "Test Passed" );
+ return 100;
+ }
+ Console.Out.WriteLine( "Test Failed" );
+
+ return 1;
+
+ }
+ }
+}
diff --git a/tests/src/GC/API/GC/GetGenerationWR2.csproj b/tests/src/GC/API/GC/GetGenerationWR2.csproj
new file mode 100644
index 0000000000..a22f2532e5
--- /dev/null
+++ b/tests/src/GC/API/GC/GetGenerationWR2.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="GetGenerationWR2.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/GetGeneration_box.cs b/tests/src/GC/API/GC/GetGeneration_box.cs
new file mode 100644
index 0000000000..6cc0db85de
--- /dev/null
+++ b/tests/src/GC/API/GC/GetGeneration_box.cs
@@ -0,0 +1,79 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GC.GetGeneration for boxed-parameters
+// should box parameter into an Object
+
+using System;
+
+public struct StructType {
+}
+
+public enum EnumType {
+}
+
+public class Test {
+
+ public static int Main() {
+ // literals
+ int gen = GC.GetGeneration(-1);
+ Console.WriteLine(gen);
+
+ gen = GC.GetGeneration("hello");
+ Console.WriteLine(gen);
+
+ // integral types
+ gen = GC.GetGeneration(new int());
+ Console.WriteLine(gen);
+
+ gen = GC.GetGeneration(new byte());
+ Console.WriteLine(gen);
+
+ gen = GC.GetGeneration(new sbyte());
+ Console.WriteLine(gen);
+
+ gen = GC.GetGeneration(new short());
+ Console.WriteLine(gen);
+
+ gen = GC.GetGeneration(new ushort());
+ Console.WriteLine(gen);
+
+ gen = GC.GetGeneration(new uint());
+ Console.WriteLine(gen);
+
+ gen = GC.GetGeneration(new long());
+ Console.WriteLine(gen);
+
+ gen = GC.GetGeneration(new ulong());
+ Console.WriteLine(gen);
+
+ gen = GC.GetGeneration(new char());
+ Console.WriteLine(gen);
+
+ //floating point types
+ gen = GC.GetGeneration(new float());
+ Console.WriteLine(gen);
+
+ gen = GC.GetGeneration(new double());
+ Console.WriteLine(gen);
+
+ // boolean types
+ gen = GC.GetGeneration(new bool());
+ Console.WriteLine(gen);
+
+ // other value types
+
+ gen = GC.GetGeneration(new StructType());
+ Console.WriteLine(gen);
+
+ gen = GC.GetGeneration(new EnumType());
+ Console.WriteLine(gen);
+
+ gen = GC.GetGeneration(new decimal());
+ Console.WriteLine(gen);
+
+ Console.WriteLine("Test passed");
+ return 100;
+ }
+}
diff --git a/tests/src/GC/API/GC/GetGeneration_box.csproj b/tests/src/GC/API/GC/GetGeneration_box.csproj
new file mode 100644
index 0000000000..4e686f3981
--- /dev/null
+++ b/tests/src/GC/API/GC/GetGeneration_box.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="GetGeneration_box.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/GetGeneration_fail.cs b/tests/src/GC/API/GC/GetGeneration_fail.cs
new file mode 100644
index 0000000000..40cf4d28ac
--- /dev/null
+++ b/tests/src/GC/API/GC/GetGeneration_fail.cs
@@ -0,0 +1,40 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GC.GetGeneration(null)..should throw exception: System.ArgumentNullException
+
+using System;
+
+public class Test
+{
+ public static int Main()
+ {
+ Object obj1 = new Object();
+
+ Console.WriteLine("This test should throw an exception!");
+ Console.WriteLine("Generation: " + GC.GetGeneration(obj1));
+
+ int[] array = new int[25];
+ array = null;
+
+ try
+ {
+ Console.WriteLine("Generation: " + GC.GetGeneration(array));
+ }
+ catch (ArgumentNullException e)
+ {
+ Console.WriteLine("Expected exception thrown: {0}", e);
+ Console.WriteLine("Test for GetGeneration() passed!");
+ return 100;
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected exception thrown:");
+ Console.WriteLine(e);
+ }
+
+ Console.WriteLine("Test for GetGeneration() failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GC/GetGeneration_fail.csproj b/tests/src/GC/API/GC/GetGeneration_fail.csproj
new file mode 100644
index 0000000000..34810f53ff
--- /dev/null
+++ b/tests/src/GC/API/GC/GetGeneration_fail.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="GetGeneration_fail.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/GetTotalMemory.cs b/tests/src/GC/API/GC/GetTotalMemory.cs
new file mode 100644
index 0000000000..eedafabfd2
--- /dev/null
+++ b/tests/src/GC/API/GC/GetTotalMemory.cs
@@ -0,0 +1,76 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System;
+
+ internal class GetTotalMemory
+ {
+ // margin of error, since GetTotalMemory is an approximation
+ // a discrepancy of more than 50 bytes should be investigated
+ public const int padding = 50;
+
+ public static int Main(String [] args )
+ {
+
+ int MB = 1024*1024;
+ int iRep = 0;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ if (args.Length==0)
+ {
+ iRep = 10;
+ }
+ else if (args.Length == 1)
+ {
+ if (!Int32.TryParse( args[0], out iRep ))
+ {
+ iRep = 10;
+ }
+ }
+ else
+ {
+ Console.WriteLine("usage: GetTotalMemory arg, good arg range is 5--50. Default value is 10." );
+ return 1;
+ }
+
+ // clean up memory before measuring
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ long heapSizeBeforeAlloc = GC.GetTotalMemory(false);
+
+ Console.WriteLine( "HeapSize before allocating any memory: {0}", heapSizeBeforeAlloc );
+
+ byte[] bary = new byte[1];
+ for(int i=1; i<=iRep; i++ )
+ {
+ bary = new byte[i*MB]; //allocate iMB memory
+ bary[0] = 1;
+ bary[i*MB-1] = 1;
+
+ long heapSizeAfterAlloc = GC.GetTotalMemory(false);
+ Console.WriteLine( "HeapSize after allocated {0} MB memory: {1}", i, heapSizeAfterAlloc);
+ if( (heapSizeAfterAlloc - heapSizeBeforeAlloc)+i*padding<= i*MB || (heapSizeAfterAlloc - heapSizeBeforeAlloc) > (i+1)*MB )
+ {
+ Console.WriteLine( "Test Failed" );
+ return 1;
+ }
+ bary[0] = 2;
+ bary[i*MB-1] = 2;
+ bary = null;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ heapSizeBeforeAlloc = GC.GetTotalMemory(false);
+ Console.WriteLine( "HeapSize after delete all objects: {0}", heapSizeBeforeAlloc );
+
+ }
+
+ Console.WriteLine( "Test Passed!" );
+ return 100;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GC/GetTotalMemory.csproj b/tests/src/GC/API/GC/GetTotalMemory.csproj
new file mode 100644
index 0000000000..be0d4dc486
--- /dev/null
+++ b/tests/src/GC/API/GC/GetTotalMemory.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="GetTotalMemory.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/KeepAlive.cs b/tests/src/GC/API/GC/KeepAlive.cs
new file mode 100644
index 0000000000..df3d9d27c4
--- /dev/null
+++ b/tests/src/GC/API/GC/KeepAlive.cs
@@ -0,0 +1,84 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*
+ * Tests GC.KeepAlive(obj), where obj is the Object reference whose
+ * finalizer you don't want called until after the call to KeepAlive.
+ *
+ * Changes:
+ * -Added Dummy2 object whose finalizer should get called for comparison
+ *
+ * Notes:
+ * - passes with complus_jitminops set*
+ * - passes with complus_gcstress = 0,1,2,3,4
+ * - passes in debug mode
+ */
+
+using System;
+
+public class Test
+{
+ public static bool visited1 = false;
+ public static bool visited2 = false;
+
+
+ public class Dummy
+ {
+ ~Dummy()
+ {
+ // this finalizer should not get called until after
+ // the call to GC.KeepAlive(obj)
+ Console.WriteLine("In Finalize() of Dummy");
+ visited1 = true;
+ }
+ }
+
+
+ public class Dummy2
+ {
+ ~Dummy2()
+ {
+ // this finalizer should get called after
+ // the call to GC.WaitForPendingFinalizers()
+ Console.WriteLine("In Finalize() of Dummy2");
+ visited2 = true;
+ }
+ }
+
+
+ public static void RunTest()
+ {
+ Dummy obj = new Dummy();
+ Dummy2 obj2 = new Dummy2();
+
+ // *uncomment the for loop to make test fail with complus_jitminops set
+ // by design as per briansul
+
+ //for (int i=0; i<5; i++) {
+ obj2 = null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ //}
+
+ GC.KeepAlive(obj); // will keep obj alive until this point
+ }
+
+ public static int Main()
+ {
+ RunTest();
+
+ if ((visited1 == false) && (visited2 == true))
+ {
+ Console.WriteLine("Test for KeepAlive() passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for KeepAlive() failed!");
+
+
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GC/KeepAlive.csproj b/tests/src/GC/API/GC/KeepAlive.csproj
new file mode 100644
index 0000000000..dd6c0eaf08
--- /dev/null
+++ b/tests/src/GC/API/GC/KeepAlive.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="KeepAlive.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/KeepAliveNull.cs b/tests/src/GC/API/GC/KeepAliveNull.cs
new file mode 100644
index 0000000000..2091a1b7c6
--- /dev/null
+++ b/tests/src/GC/API/GC/KeepAliveNull.cs
@@ -0,0 +1,56 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests KeepAlive()
+
+using System;
+
+public class Test
+{
+ public static bool visited;
+ public class Dummy
+ {
+ ~Dummy()
+ {
+ Console.WriteLine("In Finalize() of Dummy");
+ visited = true;
+ }
+ }
+
+ public class CreateObj
+ {
+ public Dummy obj;
+
+ public CreateObj()
+ {
+ obj = new Dummy();
+ }
+
+ public void RunTest()
+ {
+ obj = null; // this will collect the obj even if we have KeepAlive()
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ GC.KeepAlive(obj); // will keep alive 'obj' till this point
+ }
+ }
+
+ public static int Main()
+ {
+ CreateObj temp = new CreateObj();
+ temp.RunTest();
+
+ if (visited)
+ {
+ Console.WriteLine("Test for KeepAlive() passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for KeepAlive() failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GC/KeepAliveNull.csproj b/tests/src/GC/API/GC/KeepAliveNull.csproj
new file mode 100644
index 0000000000..8ae4315dfe
--- /dev/null
+++ b/tests/src/GC/API/GC/KeepAliveNull.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="KeepAliveNull.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/KeepAliveRecur.cs b/tests/src/GC/API/GC/KeepAliveRecur.cs
new file mode 100644
index 0000000000..abe28d53b1
--- /dev/null
+++ b/tests/src/GC/API/GC/KeepAliveRecur.cs
@@ -0,0 +1,55 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests KeepAlive() in Recursive method
+
+using System;
+
+public class Test
+{
+ public class Dummy
+ {
+ public static bool visited;
+ ~Dummy()
+ {
+ Console.WriteLine("In Finalize() of Dummy");
+ visited = true;
+ }
+ }
+
+ public static int count;
+
+ public static void foo(Object o)
+ {
+ if (count == 10) return;
+ Console.WriteLine("Count: {0}", count);
+ count++;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ foo(o); //Recursive call
+
+ GC.KeepAlive(o); // Keeping object alive
+ }
+
+ public static int Main()
+ {
+ Dummy obj = new Dummy();
+
+ foo(obj);
+ Console.WriteLine("After call to foo()");
+
+ if (Dummy.visited == false)
+ { // has not visited the Finalize()
+ Console.WriteLine("Test for KeepAlive() recursively passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for KeepAlive() recursively failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GC/KeepAliveRecur.csproj b/tests/src/GC/API/GC/KeepAliveRecur.csproj
new file mode 100644
index 0000000000..f3a09eceea
--- /dev/null
+++ b/tests/src/GC/API/GC/KeepAliveRecur.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="KeepAliveRecur.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/MaxGeneration.cs b/tests/src/GC/API/GC/MaxGeneration.cs
new file mode 100644
index 0000000000..d8e8f6896b
--- /dev/null
+++ b/tests/src/GC/API/GC/MaxGeneration.cs
@@ -0,0 +1,29 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GC.MaxGeneration
+
+using System;
+
+public class Test {
+ public static int Main() {
+
+ for(int i=0;i<1000;i++) {
+ Object[] array = new Object[i];
+ }
+
+ Console.WriteLine("Max Generations: " + GC.MaxGeneration);
+ if(GC.MaxGeneration == 2) {
+ Console.WriteLine("Test for GC.MaxGeneration passed!");
+ return 100;
+ }
+ else {
+ Console.WriteLine("Test for GC.MaxGeneration failed!");
+ return 1;
+ }
+
+ }
+
+ }
+
diff --git a/tests/src/GC/API/GC/MaxGeneration.csproj b/tests/src/GC/API/GC/MaxGeneration.csproj
new file mode 100644
index 0000000000..c9e83e0262
--- /dev/null
+++ b/tests/src/GC/API/GC/MaxGeneration.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="MaxGeneration.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/ReRegisterForFinalize.cs b/tests/src/GC/API/GC/ReRegisterForFinalize.cs
new file mode 100644
index 0000000000..889e162394
--- /dev/null
+++ b/tests/src/GC/API/GC/ReRegisterForFinalize.cs
@@ -0,0 +1,67 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests ReRegisterForFinalize()
+
+using System;
+
+public class Test {
+
+ public class Dummy {
+
+ public static int flag;
+ ~Dummy() {
+ Console.WriteLine("In Finalize() of Dummy");
+ if(flag == 0) flag=1; // one object has visited;
+ else flag=0; //error-- both objects have visited
+ }
+ }
+
+ public class CreateObj{
+ Dummy obj1;
+ Dummy obj2;
+
+ public CreateObj() {
+ obj1 = new Dummy();
+ obj2 = new Dummy();
+
+
+ GC.SuppressFinalize(obj1); // should not call the Finalize() for obj1
+ GC.SuppressFinalize(obj2); // should not call the Finalize() for obj2
+ }
+
+ public bool RunTest() {
+
+ GC.ReRegisterForFinalize(obj1); // should call Finalize() for obj1 now.
+
+ obj1=null;
+ obj2=null;
+
+ GC.Collect();
+
+ GC.WaitForPendingFinalizers(); // call all Finalizers.
+
+ if(Dummy.flag==1) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+
+ }
+ public static int Main() {
+ CreateObj temp = new CreateObj();
+ bool passed = temp.RunTest();
+
+ if(passed) {
+ Console.WriteLine("Test for ReRegisterForFinalize() passed!");
+ return 100;
+ }
+ else {
+ Console.WriteLine("Test for ReRegisterForFinalize() failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GC/ReRegisterForFinalize.csproj b/tests/src/GC/API/GC/ReRegisterForFinalize.csproj
new file mode 100644
index 0000000000..6db3912b55
--- /dev/null
+++ b/tests/src/GC/API/GC/ReRegisterForFinalize.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="ReRegisterForFinalize.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/ReRegisterForFinalize_null.cs b/tests/src/GC/API/GC/ReRegisterForFinalize_null.cs
new file mode 100644
index 0000000000..06f4e08dfe
--- /dev/null
+++ b/tests/src/GC/API/GC/ReRegisterForFinalize_null.cs
@@ -0,0 +1,42 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests ReRegisterForFinalize()
+
+using System;
+
+public class Test
+{
+ public bool RunTest()
+ {
+ try
+ {
+ GC.ReRegisterForFinalize(null); // should call Finalize() for obj1 now.
+ }
+ catch (ArgumentNullException)
+ {
+ return true;
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("Unexpected Exception!");
+ }
+
+ return false;
+ }
+
+
+ public static int Main()
+ {
+ Test t = new Test();
+ if (t.RunTest())
+ {
+ Console.WriteLine("Null Test for ReRegisterForFinalize() passed!");
+ return 100;
+ }
+
+ Console.WriteLine("Null Test for ReRegisterForFinalize() failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GC/ReRegisterForFinalize_null.csproj b/tests/src/GC/API/GC/ReRegisterForFinalize_null.csproj
new file mode 100644
index 0000000000..6580c0934d
--- /dev/null
+++ b/tests/src/GC/API/GC/ReRegisterForFinalize_null.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="ReRegisterForFinalize_null.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/RemoveMemoryPressureTest.cs b/tests/src/GC/API/GC/RemoveMemoryPressureTest.cs
new file mode 100644
index 0000000000..e288efb6f8
--- /dev/null
+++ b/tests/src/GC/API/GC/RemoveMemoryPressureTest.cs
@@ -0,0 +1,132 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/* RemoveMemoryPressureTest
+ *
+ * Tests GC.RemoveMemoryPressure by passing it values that are too small (<=0) and
+ * values that are too large (>Int32.MaxValue on 32-bit).
+ */
+
+
+using System;
+using System.Diagnostics;
+using System.Security;
+using System.Runtime.InteropServices;
+
+public class RemoveMemoryPressureTest
+{
+ public int TestCount = 0;
+
+ private long[] _negValues = { 0, -1, Int32.MinValue - (long)1, Int64.MinValue / (long)2, Int64.MinValue };
+ private long[] _largeValues = { Int32.MaxValue + (long)1, Int64.MaxValue };
+
+
+ private RemoveMemoryPressureTest()
+ {
+ }
+
+
+ public bool TooSmallTest()
+ {
+ TestCount++;
+ bool retVal = true;
+
+ foreach (long i in _negValues)
+ {
+ try
+ {
+ GC.RemoveMemoryPressure(i);
+ Console.WriteLine("Failure at TooSmallTest: {0}", i);
+ retVal = false;
+ break;
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ Console.WriteLine("Failure at TooSmallTest: {0}", i);
+ retVal = false;
+ break;
+ }
+ }
+
+ if (retVal)
+ Console.WriteLine("TooSmallTest Passed");
+ return retVal;
+ }
+
+
+ public bool TooLargeTest()
+ {
+ TestCount++;
+
+ bool retVal = true;
+
+ foreach (long i in _largeValues)
+ {
+ try
+ {
+ GC.RemoveMemoryPressure(i);
+ // this should throw exception on 32-bit
+ if (IntPtr.Size == Marshal.SizeOf(new Int32()))
+ {
+ Console.WriteLine("Failure at LargeValueTest: {0}", i);
+ retVal = false;
+ break;
+ }
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ // this should not throw exception on 64-bit
+ if (IntPtr.Size == Marshal.SizeOf(new Int64()))
+ {
+ Console.WriteLine("Failure at LargeValueTest: {0}", i);
+ retVal = false;
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ retVal = false;
+ break;
+ }
+ }
+
+ if (retVal)
+ Console.WriteLine("TooLargeTest Passed");
+ return retVal;
+ }
+
+
+ public bool RunTest()
+ {
+ int passCount = 0;
+
+ if (TooSmallTest())
+ passCount++;
+
+ if (TooLargeTest())
+ passCount++;
+
+ return (passCount == TestCount);
+ }
+
+
+ public static int Main()
+ {
+ RemoveMemoryPressureTest test = new RemoveMemoryPressureTest();
+
+ if (test.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GC/RemoveMemoryPressureTest.csproj b/tests/src/GC/API/GC/RemoveMemoryPressureTest.csproj
new file mode 100644
index 0000000000..81fecea01f
--- /dev/null
+++ b/tests/src/GC/API/GC/RemoveMemoryPressureTest.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="RemoveMemoryPressureTest.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/RemoveUsageTest.cs b/tests/src/GC/API/GC/RemoveUsageTest.cs
new file mode 100644
index 0000000000..4087d89ee3
--- /dev/null
+++ b/tests/src/GC/API/GC/RemoveUsageTest.cs
@@ -0,0 +1,114 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/* RemoveUsageTest
+ *
+ * Tests GC.RemoveMemoryPressure by passing a valid value (RemoveMemoryPressureTest.Pressure)
+ * and making sure the objects with Removed pressure get collected less times by
+ * the GC than those with pressure.
+ */
+
+
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+public class Dummy
+{
+ private long _pressure;
+
+ public Dummy(long pressure)
+ {
+ _pressure = pressure;
+ GC.AddMemoryPressure(pressure);
+ }
+
+ public Dummy() { }
+
+ ~Dummy()
+ {
+ if (_pressure > 0)
+ GC.RemoveMemoryPressure(_pressure);
+ }
+}
+
+
+public class RemoveUsageTest
+{
+ public static int Pressure = 100000; // test will fail with values less than this
+ private int _numTests = 0;
+
+ private RemoveUsageTest()
+ {
+ }
+
+
+ public bool RemoveTest()
+ {
+ _numTests++;
+
+ int gcCount1 = GC.CollectionCount(0);
+ for (int i = 0; i < 100; i++)
+ {
+ Dummy heavy = new Dummy(RemoveUsageTest.Pressure);
+ int gen = GC.GetGeneration(heavy);
+ if (gen != 0)
+ {
+ Console.WriteLine("Warning: newly-allocated dummy ended up in gen {0}", gen);
+ }
+ GC.WaitForPendingFinalizers();
+ }
+ gcCount1 = GC.CollectionCount(0) - gcCount1;
+
+
+ int gcCount2 = GC.CollectionCount(0);
+ for (int i = 0; i < 100; i++)
+ {
+ Dummy light = new Dummy();
+ int gen = GC.GetGeneration(light);
+ if (gen != 0)
+ {
+ Console.WriteLine("Warning: newly-allocated dummy ended up in gen {0}", gen);
+ }
+ GC.WaitForPendingFinalizers();
+ }
+ gcCount2 = GC.CollectionCount(0) - gcCount2;
+
+ Console.WriteLine("{0} {1}", gcCount1, gcCount2);
+ if (gcCount1 > gcCount2)
+ {
+ Console.WriteLine("RemoveTest Passed");
+ Console.WriteLine();
+ return true;
+ }
+
+ Console.WriteLine("RemoveTest Failed");
+ Console.WriteLine();
+ return false;
+ }
+
+ public bool RunTest()
+ {
+ int numPass = 0;
+
+ if (RemoveTest())
+ numPass++;
+
+ return (numPass == _numTests);
+ }
+
+ public static int Main()
+ {
+ RemoveUsageTest test = new RemoveUsageTest();
+
+ if (test.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GC/RemoveUsageTest.csproj b/tests/src/GC/API/GC/RemoveUsageTest.csproj
new file mode 100644
index 0000000000..b3a8abbfa0
--- /dev/null
+++ b/tests/src/GC/API/GC/RemoveUsageTest.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="RemoveUsageTest.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/SuppressFinalize.cs b/tests/src/GC/API/GC/SuppressFinalize.cs
new file mode 100644
index 0000000000..b8c3aa8808
--- /dev/null
+++ b/tests/src/GC/API/GC/SuppressFinalize.cs
@@ -0,0 +1,40 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests SuppressFinalize()
+
+using System;
+
+public class Test {
+
+ public class Dummy {
+
+ public static bool visited;
+ ~Dummy() {
+ Console.WriteLine("In Finalize() of Dummy");
+ visited=true;
+ }
+ }
+
+ public static int Main() {
+
+ Dummy obj1 = new Dummy();
+
+ GC.SuppressFinalize(obj1); // should not call the Finalizer() for obj1
+ obj1=null;
+
+ GC.Collect();
+
+ GC.WaitForPendingFinalizers(); // call all Finalizers.
+
+ if(Dummy.visited == false) {
+ Console.WriteLine("Test for SuppressFinalize() passed!");
+ return 100;
+ }
+ else {
+ Console.WriteLine("Test for SuppressFinalize() failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GC/SuppressFinalize.csproj b/tests/src/GC/API/GC/SuppressFinalize.csproj
new file mode 100644
index 0000000000..5c1c8bf09f
--- /dev/null
+++ b/tests/src/GC/API/GC/SuppressFinalize.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="SuppressFinalize.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/SuppressFinalize_Null.cs b/tests/src/GC/API/GC/SuppressFinalize_Null.cs
new file mode 100644
index 0000000000..8986e1504f
--- /dev/null
+++ b/tests/src/GC/API/GC/SuppressFinalize_Null.cs
@@ -0,0 +1,42 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests SuppressFinalize()
+
+using System;
+
+public class Test
+{
+ public bool RunTest()
+ {
+ try
+ {
+ GC.SuppressFinalize(null); // should not call the Finalizer() for obj1
+ }
+ catch (ArgumentNullException)
+ {
+ return true;
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("Unexpected Exception!");
+ }
+
+ return false;
+ }
+
+
+ public static int Main()
+ {
+ Test t = new Test();
+ if (t.RunTest())
+ {
+ Console.WriteLine("Null test for SuppressFinalize() passed!");
+ return 100;
+ }
+
+ Console.WriteLine("Null test for SuppressFinalize() failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GC/SuppressFinalize_Null.csproj b/tests/src/GC/API/GC/SuppressFinalize_Null.csproj
new file mode 100644
index 0000000000..24c1884848
--- /dev/null
+++ b/tests/src/GC/API/GC/SuppressFinalize_Null.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="SuppressFinalize_Null.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/TotalMemory.cs b/tests/src/GC/API/GC/TotalMemory.cs
new file mode 100644
index 0000000000..ad5384621c
--- /dev/null
+++ b/tests/src/GC/API/GC/TotalMemory.cs
@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GC.TotalMemory
+
+using System;
+
+public class Test {
+
+ public static int Main() {
+
+ GC.Collect();
+ GC.Collect();
+
+ int[] array1 = new int[20000];
+ int memold = (int) GC.GetTotalMemory(false);
+ Console.WriteLine("Total Memory: " + memold);
+
+ array1=null;
+ GC.Collect();
+
+ int[] array2 = new int[40000];
+ int memnew = (int) GC.GetTotalMemory(false);
+ Console.WriteLine("Total Memory: " + memnew);
+
+ if(memnew >= memold) {
+ Console.WriteLine("Test for GC.TotalMemory passed!");
+ return 100;
+ }
+ else {
+ Console.WriteLine("Test for GC.TotalMemory failed!");
+ return 1;
+ }
+ }
+}
+
diff --git a/tests/src/GC/API/GC/TotalMemory.csproj b/tests/src/GC/API/GC/TotalMemory.csproj
new file mode 100644
index 0000000000..b9d5f0a915
--- /dev/null
+++ b/tests/src/GC/API/GC/TotalMemory.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="TotalMemory.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/TotalMemory2.cs b/tests/src/GC/API/GC/TotalMemory2.cs
new file mode 100644
index 0000000000..71f16f3385
--- /dev/null
+++ b/tests/src/GC/API/GC/TotalMemory2.cs
@@ -0,0 +1,45 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GC.TotalMemory
+
+using System;
+
+public class Test
+{
+ public static int Main()
+ {
+ GC.Collect();
+ GC.Collect();
+
+ int[] array1 = new int[20000];
+ int memold = (int)GC.GetTotalMemory(false);
+ Console.WriteLine("Total Memory: " + memold);
+
+ array1 = null;
+
+ int before = GC.CollectionCount(2);
+ Console.WriteLine("# Collections " + before);
+ int[] array2 = new int[40000];
+ int memnew = (int)GC.GetTotalMemory(true);
+ Console.WriteLine("Total Memory: " + memnew);
+ int after = GC.CollectionCount(2);
+ Console.WriteLine("# Collections " + after);
+
+ GC.KeepAlive(array2);
+
+
+ if ((before < after) && (memnew > memold))
+ {
+ Console.WriteLine("Test for GC.TotalMemory passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for GC.TotalMemory failed!");
+ return 1;
+ }
+ }
+}
+
diff --git a/tests/src/GC/API/GC/TotalMemory2.csproj b/tests/src/GC/API/GC/TotalMemory2.csproj
new file mode 100644
index 0000000000..fe90973b65
--- /dev/null
+++ b/tests/src/GC/API/GC/TotalMemory2.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="TotalMemory2.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GC/app.config b/tests/src/GC/API/GC/app.config
new file mode 100644
index 0000000000..6f7bbd9d2b
--- /dev/null
+++ b/tests/src/GC/API/GC/app.config
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/API/GCHandle/AddrOfPinnedObject.cs b/tests/src/GC/API/GCHandle/AddrOfPinnedObject.cs
new file mode 100644
index 0000000000..caf43ec4d1
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/AddrOfPinnedObject.cs
@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GCHandle.AddrOfPinnedObject() .. The address of a pinned object remains same even after a collection
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public static int Main()
+ {
+ int[] array = new int[25];
+
+ Console.WriteLine("Allocating a pinned handle to object..");
+ GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned); // pinned this object.
+
+ IntPtr addr1 = handle.AddrOfPinnedObject();
+ Console.WriteLine("AddrOfPinnedObject = {0}", addr1);
+
+ GC.Collect();
+ IntPtr addr2 = handle.AddrOfPinnedObject();
+ Console.WriteLine("After Collection AddrOfPinnedObject = {0}", addr2);
+
+ if (addr1 == addr2)
+ {
+ Console.WriteLine("Test for GCHandle.AddrOfPinnedObject() passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for GCHandle.AddrOfPinnedObject() failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/AddrOfPinnedObject.csproj b/tests/src/GC/API/GCHandle/AddrOfPinnedObject.csproj
new file mode 100644
index 0000000000..f5d90932f3
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/AddrOfPinnedObject.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="AddrOfPinnedObject.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/AddrOfPinnedObject_neg.cs b/tests/src/GC/API/GCHandle/AddrOfPinnedObject_neg.cs
new file mode 100644
index 0000000000..9af56b6ace
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/AddrOfPinnedObject_neg.cs
@@ -0,0 +1,64 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Negative Test for GCHandle.AddrOfPinnedObject()...should throw and exception when handle is not pinned.
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public static int Main()
+ {
+ int[] array = new int[25];
+ bool passed = true;
+
+ Console.WriteLine("Allocating a normal handle to object..");
+ GCHandle handle = GCHandle.Alloc(array); // handle is NOT pinned.
+
+ try
+ {
+ IntPtr addr = handle.AddrOfPinnedObject();
+ Console.WriteLine("AddrOfPinnedObject = {0}", addr);
+ }
+ catch (InvalidOperationException)
+ {
+ Console.WriteLine("Caught expected exception");
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("Caught unexpected exception!");
+ Console.WriteLine("Test1 Failed!");
+ passed = false;
+ }
+
+ handle.Free();
+
+ try
+ {
+ IntPtr addr = handle.AddrOfPinnedObject();
+ Console.WriteLine("AddrOfPinnedObject = {0}", addr);
+ }
+ catch (InvalidOperationException)
+ {
+ Console.WriteLine("Caught expected exception");
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("Caught unexpected exception!");
+ Console.WriteLine("Test1 Failed!");
+ passed = false;
+ }
+
+
+ if (!passed)
+ {
+ Console.WriteLine("Test Failed!");
+ return 1;
+ }
+
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/AddrOfPinnedObject_neg.csproj b/tests/src/GC/API/GCHandle/AddrOfPinnedObject_neg.csproj
new file mode 100644
index 0000000000..aaa378b875
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/AddrOfPinnedObject_neg.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="AddrOfPinnedObject_neg.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/Alloc.cs b/tests/src/GC/API/GCHandle/Alloc.cs
new file mode 100644
index 0000000000..a0c7b4afec
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Alloc.cs
@@ -0,0 +1,34 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GCHandle.Alloc()
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public static int Main()
+ {
+ int[] array = new int[25];
+
+ Console.WriteLine("Allocating a handle to object..");
+ GCHandle handle = GCHandle.Alloc(array);
+
+ bool ans = handle.IsAllocated;
+ if (ans)
+ Console.WriteLine("GCHandle is allocated = ");
+
+ if (ans == true)
+ {
+ Console.WriteLine("Test for GCHandle.Alloc() passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for GCHandle.Alloc() failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/Alloc.csproj b/tests/src/GC/API/GCHandle/Alloc.csproj
new file mode 100644
index 0000000000..78f3eb2f97
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Alloc.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Alloc.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/Alloc_neg.cs b/tests/src/GC/API/GCHandle/Alloc_neg.cs
new file mode 100644
index 0000000000..c082540f85
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Alloc_neg.cs
@@ -0,0 +1,40 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Negative Test for GCHandle.Alloc() .. trying to allocated a handle to a null object.
+
+/*************************************************************************************
+ This is allowed because Pinning happens whenever a GC occurs. So if a GC occurs and
+ there is an object in the handle, we will pin it. It is quite reasonable to create
+ the handle now and fill in the object later.
+**************************************************************************************/
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public static int Main()
+ {
+ int[] array = new int[25];
+ array = null;
+
+ GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned);
+
+ bool ans = handle.IsAllocated;
+ if (ans)
+ Console.WriteLine("GCHandle is allocated = ");
+
+ if (ans == true)
+ {
+ Console.WriteLine("Negative test for GCHandle.Alloc() passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Negative test for GCHandle.Alloc() failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/Alloc_neg.csproj b/tests/src/GC/API/GCHandle/Alloc_neg.csproj
new file mode 100644
index 0000000000..240d0591fe
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Alloc_neg.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Alloc_neg.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/Alloc_neg2.cs b/tests/src/GC/API/GCHandle/Alloc_neg2.cs
new file mode 100644
index 0000000000..d9615a81f7
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Alloc_neg2.cs
@@ -0,0 +1,57 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*
+This test verifies GCHandle.Alloc's ability to validate bad GCHandleTypes, since any int can be cast as a GCHandleType
+*/
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public static int Main()
+ {
+ // The third element needs to be updated if Pinned is no longer the last value in the GCHandleType enum
+ long[] invalidValues = { Int32.MinValue, -1, (long)(GCHandleType.Pinned + 1), Int32.MaxValue, UInt32.MaxValue, Int64.MaxValue };
+ bool passed = true;
+
+ for (int i = 0; i < invalidValues.Length; i++)
+ {
+ // GCHandle.Alloc internally casts the GCHandleType to a uint
+ Console.WriteLine("Input: {0}, Converted to: {1}", invalidValues[i], (uint)invalidValues[i]);
+
+ GCHandle gch = new GCHandle();
+ try
+ {
+ gch = GCHandle.Alloc(new object(), (GCHandleType)(invalidValues[i]));
+ Console.WriteLine("Failed");
+ passed = false;
+ gch.Free();
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ // caught the expected exception
+ Console.WriteLine("Passed");
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Caught unexpected exception");
+ Console.WriteLine(e);
+ passed = false;
+ }
+
+ Console.WriteLine();
+ }
+
+ if (passed)
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/Alloc_neg2.csproj b/tests/src/GC/API/GCHandle/Alloc_neg2.csproj
new file mode 100644
index 0000000000..8f251203f5
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Alloc_neg2.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Alloc_neg2.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/Casting.cs b/tests/src/GC/API/GCHandle/Casting.cs
new file mode 100644
index 0000000000..94f8c40e13
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Casting.cs
@@ -0,0 +1,125 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*
+ * TEST: Casting
+ * DESCRIPTION: Tests casting to and from IntPtrs.
+ * See also ToFromIntPtr.cs test.
+ */
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Dummy
+{
+ public Dummy(int i)
+ {
+ this.i = i;
+ }
+ public int i;
+}
+
+
+public class CastingTest
+{
+ private int _numTests = 0;
+
+ private bool CastTest()
+ {
+ _numTests++;
+
+ int dummyValue = 101;
+
+ GCHandle gch = GCHandle.Alloc(new Dummy(dummyValue));
+ GCHandle gch2 = (GCHandle)((IntPtr)gch);
+ if (gch.Target == gch2.Target)
+ {
+ Console.WriteLine("CastTest Passed");
+ return true;
+ }
+
+ Console.WriteLine("CastTest Failed");
+ return false;
+ }
+
+
+ private bool FromZeroTest()
+ {
+ _numTests++;
+ try
+ {
+ GCHandle gch3 = (GCHandle)IntPtr.Zero;
+ }
+ catch (InvalidOperationException)
+ {
+ Console.WriteLine("FromZeroTest Passed");
+ return true;
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("Unexpected Exception:");
+ }
+
+ Console.WriteLine("FromZeroTest Failed");
+ return false;
+ }
+
+
+ private bool ToZeroTest()
+ {
+ _numTests++;
+
+ GCHandle gch = GCHandle.Alloc(new Dummy(99));
+ gch.Free();
+ IntPtr intPtr = (IntPtr)gch;
+
+ if (intPtr == IntPtr.Zero)
+ {
+ Console.WriteLine("ToZeroTest Passed");
+ return true;
+ }
+
+ Console.WriteLine("ToZeroTest Failed");
+ return false;
+ }
+
+
+ public bool RunTests()
+ {
+ int numPassed = 0;
+
+ if (CastTest())
+ {
+ numPassed++;
+ }
+
+ if (ToZeroTest())
+ {
+ numPassed++;
+ }
+
+ if (FromZeroTest())
+ {
+ numPassed++;
+ }
+
+ Console.WriteLine();
+ return (_numTests == numPassed);
+ }
+
+
+ public static int Main()
+ {
+ CastingTest t = new CastingTest();
+
+ if (t.RunTests())
+ {
+ Console.WriteLine("CastingTest Passed!");
+ return 100;
+ }
+
+ Console.WriteLine("CastingTest Failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/Casting.csproj b/tests/src/GC/API/GCHandle/Casting.csproj
new file mode 100644
index 0000000000..e603c12ac1
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Casting.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Casting.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/Equality.cs b/tests/src/GC/API/GCHandle/Equality.cs
new file mode 100644
index 0000000000..eb91658b8f
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Equality.cs
@@ -0,0 +1,99 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Equality
+{
+ public bool RunTest()
+ {
+ Object o = new Object();
+ GCHandle gc = GCHandle.Alloc(o);
+ GCHandle gc2 = GCHandle.Alloc(o);
+ GCHandle gc3 = gc;
+
+ if (gc.Equals(null))
+ {
+ Console.WriteLine("Equals null failed");
+ return false;
+ }
+
+ if (gc.Equals(new Object()))
+ {
+ Console.WriteLine("Equals new Object failed");
+ return false;
+ }
+
+ if (gc.Equals(gc2))
+ {
+ Console.WriteLine("Equals GCHandle 1 failed");
+ return false;
+ }
+
+ if (!gc.Equals(gc3))
+ {
+ Console.WriteLine("Equals GCHandle 2 failed");
+ return false;
+ }
+
+
+ if (gc == gc2)
+ {
+ Console.WriteLine("== GCHandle 1 failed");
+ return false;
+ }
+
+ if (!(gc == gc3))
+ {
+ Console.WriteLine("== GCHandle 2 failed");
+ return false;
+ }
+
+ if (gc.GetHashCode() == gc2.GetHashCode())
+ {
+ Console.WriteLine("GetHashCode 1 failed");
+ return false;
+ }
+
+ if (gc.GetHashCode() != gc3.GetHashCode())
+ {
+ Console.WriteLine("GetHashCode 2 failed");
+ return false;
+ }
+
+
+ if (!(gc != gc2))
+ {
+ Console.WriteLine("!= GCHandle 1 failed");
+ return false;
+ }
+
+ if (gc != gc3)
+ {
+ Console.WriteLine("!= GCHandle 2 failed");
+ return false;
+ }
+
+ return true;
+ }
+
+
+ public static int Main()
+ {
+ Equality e = new Equality();
+
+
+ if (e.RunTest())
+ {
+ Console.WriteLine();
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine();
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/Equality.csproj b/tests/src/GC/API/GCHandle/Equality.csproj
new file mode 100644
index 0000000000..95ff2721d7
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Equality.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Equality.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/Free.cs b/tests/src/GC/API/GCHandle/Free.cs
new file mode 100644
index 0000000000..97ae4e5c38
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Free.cs
@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GCHandle.Free()
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public static int Main()
+ {
+ int[] array = new int[25];
+
+ Console.WriteLine("Allocating a handle to object..");
+ GCHandle handle = GCHandle.Alloc(array);
+
+ Console.WriteLine("Freeing the handle...");
+ handle.Free();
+
+ bool ans = handle.IsAllocated;
+ if (ans)
+ Console.WriteLine("GCHandle is allocated");
+
+ if (ans == false)
+ {
+ Console.WriteLine("Test for GCHandle.Free() passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for GCHandle.Free() failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/Free.csproj b/tests/src/GC/API/GCHandle/Free.csproj
new file mode 100644
index 0000000000..c0e2d02828
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Free.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Free.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/Free_neg.cs b/tests/src/GC/API/GCHandle/Free_neg.cs
new file mode 100644
index 0000000000..38c261a0c6
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Free_neg.cs
@@ -0,0 +1,51 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GCHandle.Free()
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public static int Main()
+ {
+ int[] array = new int[25];
+
+ bool pass = false;
+
+ Console.WriteLine("Allocating a handle to object..");
+ GCHandle handle = GCHandle.Alloc(array);
+
+ handle.Free();
+
+ Console.WriteLine("Freeing the handle...");
+
+ try
+ {
+ handle.Free();
+ }
+ catch (InvalidOperationException)
+ {
+ Console.WriteLine("Expected InvalidOperationException");
+ pass = true;
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("This should NOT throw an exception:");
+ pass = false;
+ }
+
+ if (pass)
+ {
+ Console.WriteLine("Test for GCHandle.Free() passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for GCHandle.Free() failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/Free_neg.csproj b/tests/src/GC/API/GCHandle/Free_neg.csproj
new file mode 100644
index 0000000000..a053431708
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Free_neg.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Free_neg.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/HandleCopy.cs b/tests/src/GC/API/GCHandle/HandleCopy.cs
new file mode 100644
index 0000000000..ccc124c6e6
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/HandleCopy.cs
@@ -0,0 +1,82 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests Copy of GCHandleType.Weak .. the object with GCHandleType Weak
+// will be collected. The handle and it's copy remain allocated even after the object is collected.
+// Also tests the target of the handle.
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public class Dummy
+ {
+ public static int flag = 0;
+
+ ~Dummy()
+ {
+ Console.WriteLine("In Finalize() of Dummy");
+ flag = 99;
+ }
+ }
+
+ public class CreateObj
+ {
+ public Dummy obj;
+ public GCHandle handle, copy;
+
+ public CreateObj()
+ {
+ obj = new Dummy();
+ Console.WriteLine("Allocating a Weak handle to object..");
+ handle = GCHandle.Alloc(obj, GCHandleType.Weak);
+
+ // making a copy of the handle
+ copy = handle;
+ }
+
+ public bool RunTest()
+ {
+ // ensuring that GC happens even with /debug mode
+ obj = null;
+ GC.Collect();
+
+ GC.WaitForPendingFinalizers();
+
+ bool ans1 = handle.IsAllocated;
+ bool ans2 = copy.IsAllocated;
+
+ //Console.WriteLine("handle.IsAllocated = " + ans1);
+ //Console.WriteLine("copy.IsAllocated = " + ans2);
+
+ Dummy target1 = (Dummy)handle.Target;
+ Dummy target2 = (Dummy)copy.Target;
+
+ if (((ans1 == true) && (ans2 == true)) && ((target1 == null) && (target2 == null)))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+
+ public static int Main()
+ {
+ CreateObj temp = new CreateObj();
+ if (temp.RunTest())
+ {
+ Console.WriteLine("Test for Copy of GCHandle passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for Copy of GCHandle failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/HandleCopy.csproj b/tests/src/GC/API/GCHandle/HandleCopy.csproj
new file mode 100644
index 0000000000..be3ca8d2f2
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/HandleCopy.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="HandleCopy.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/IsAllocated.cs b/tests/src/GC/API/GCHandle/IsAllocated.cs
new file mode 100644
index 0000000000..33ad109d56
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/IsAllocated.cs
@@ -0,0 +1,49 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GCHandle.IsAllocated
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public static int Main()
+ {
+ int[] array = new int[25];
+
+ Console.WriteLine("Allocating a handle to object..");
+ GCHandle handle = GCHandle.Alloc(array);
+
+ bool ans1 = handle.IsAllocated;
+
+ Console.Write("GCHandle.IsAllocated = ");
+
+ if (ans1)
+ Console.WriteLine("True");
+ else
+ Console.WriteLine("False");
+
+ Console.WriteLine("Freeing the handle...");
+ handle.Free();
+
+ bool ans2 = handle.IsAllocated;
+ Console.Write("GCHandle.IsAllocated = ");
+ if (ans2)
+ Console.WriteLine("True");
+ else
+ Console.WriteLine("False");
+
+ if ((ans1 == true) && (ans2 == false))
+ {
+ Console.WriteLine("Test for GCHandle.IsAllocated passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for GCHandle.IsAllocated failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/IsAllocated.csproj b/tests/src/GC/API/GCHandle/IsAllocated.csproj
new file mode 100644
index 0000000000..1091eeecd7
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/IsAllocated.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="IsAllocated.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/Normal.cs b/tests/src/GC/API/GCHandle/Normal.cs
new file mode 100644
index 0000000000..6fc46eeb17
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Normal.cs
@@ -0,0 +1,48 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GCHandleType.Normal .. the object with GCHandleType Normal
+// should not be collected.
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test {
+
+ public class Dummy {
+
+ public static int flag=0;
+ ~Dummy() {
+ Console.WriteLine("In Finalize() of Dummy");
+ flag=99;
+ }
+ }
+
+ public static int Main() {
+
+ Dummy obj = new Dummy();
+
+ Console.WriteLine("Allocating a normal handle to object..");
+ GCHandle handle = GCHandle.Alloc(obj,GCHandleType.Normal); // Normal handle
+
+ // ensuring that GC happens even with /debug mode
+ obj=null;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ if(Dummy.flag == 0) {
+
+ Console.WriteLine("Test for GCHandleType.Normal passed!");
+ return 100;
+ }
+ else {
+
+ Console.WriteLine("Test for GCHandleType.Normal failed!");
+ return 1;
+ }
+
+
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/Normal.csproj b/tests/src/GC/API/GCHandle/Normal.csproj
new file mode 100644
index 0000000000..cc462b9822
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Normal.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Normal.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/PinObj_neg.cs b/tests/src/GC/API/GCHandle/PinObj_neg.cs
new file mode 100644
index 0000000000..2a70fc7fa4
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/PinObj_neg.cs
@@ -0,0 +1,40 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests Pinned handle for array of Objects...
+// Pinning of "Object" type is not allowed and should throw an exception.
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public static int Main()
+ {
+ Object[] array = new Object[25];
+
+ Console.WriteLine("Trying to pin array of objects..");
+ Console.WriteLine("Should throw an exception");
+ try
+ {
+ GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned);
+ }
+ catch (ArgumentException)
+ {
+ Console.WriteLine("Expected ArgumentException");
+
+ Console.WriteLine("Test passed!");
+ return 100;
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("Unexpected exception:");
+ return 2;
+ }
+
+
+ Console.WriteLine("Test failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/PinObj_neg.csproj b/tests/src/GC/API/GCHandle/PinObj_neg.csproj
new file mode 100644
index 0000000000..dc1b4451f9
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/PinObj_neg.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="PinObj_neg.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/Pinned.cs b/tests/src/GC/API/GCHandle/Pinned.cs
new file mode 100644
index 0000000000..22527c934f
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Pinned.cs
@@ -0,0 +1,44 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GCHandleType.Pinned .. the pinned object should not be collected.
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public static int Main()
+ {
+ int[] array = new int[25];
+
+ Console.WriteLine("Allocating a pinned handle to object..");
+ GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned); // Pinned handle
+
+ //int gen1 = GC.GetGeneration(array);
+ //Console.WriteLine("Object is in generation " + gen1);
+
+ IntPtr addr1 = handle.AddrOfPinnedObject();
+
+ // ensuring that GC happens even with /debug mode
+ array = null;
+ GC.Collect();
+
+ //int gen2 = GC.GetGeneration(array);
+ //Console.WriteLine("Object is in generation " + gen2);
+
+ IntPtr addr2 = handle.AddrOfPinnedObject();
+
+ if (addr1 == addr2)
+ {
+ Console.WriteLine("Test for GCHandleType.Pinned passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for GCHandleType.Pinned failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/Pinned.csproj b/tests/src/GC/API/GCHandle/Pinned.csproj
new file mode 100644
index 0000000000..ccbdb65f64
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Pinned.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Pinned.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/Target.cs b/tests/src/GC/API/GCHandle/Target.cs
new file mode 100644
index 0000000000..7f42cfef6a
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Target.cs
@@ -0,0 +1,68 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GCHandle.Target
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public class Dummy
+ {
+ public int flag;
+
+ public Dummy(int i)
+ {
+ flag = i;
+ }
+
+ public int getFlag()
+ {
+ return flag;
+ }
+ }
+ public static int Main()
+ {
+ Dummy obj = new Dummy(99);
+ bool passed = true;
+
+ Console.WriteLine("Allocating a handle to object..");
+ GCHandle handle = GCHandle.Alloc(obj);
+
+ Dummy target = (Dummy)handle.Target;
+
+ if (target.getFlag() == 99)
+ {
+ Console.WriteLine("Test for GCHandle.get_Target passed!");
+ }
+ else
+ {
+ Console.WriteLine("Test for GCHandle.get_Target failed!");
+ passed = false;
+ }
+
+ Dummy obj2 = new Dummy(66);
+ handle.Target = obj2;
+ Dummy target2 = (Dummy)handle.Target;
+
+ if (target2.getFlag() == 66)
+ {
+ Console.WriteLine("Test for GCHandle.set_Target passed!");
+ }
+ else
+ {
+ Console.WriteLine("Test for GCHandle.set_Target failed!");
+ passed = false;
+ }
+
+ if (passed)
+ {
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+ Console.WriteLine("Test Failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/Target.csproj b/tests/src/GC/API/GCHandle/Target.csproj
new file mode 100644
index 0000000000..53825f8492
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Target.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Target.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/Target_neg.cs b/tests/src/GC/API/GCHandle/Target_neg.cs
new file mode 100644
index 0000000000..1434a8aa33
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Target_neg.cs
@@ -0,0 +1,75 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GCHandle.Target negative scenarios
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public static int Main()
+ {
+ bool passed = true;
+
+ Object o = new Object();
+ GCHandle gch = GCHandle.Alloc(o);
+ gch.Free();
+
+ try
+ {
+ gch.Target = o;
+ }
+ catch (InvalidOperationException)
+ {
+ Console.WriteLine("Caught expected InvalidOperationException");
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("Caught unexpected exception!");
+
+ Console.WriteLine("Test1 Failed!");
+ passed = false;
+ }
+
+ try
+ {
+ Object o2 = gch.Target;
+ }
+ catch (InvalidOperationException)
+ {
+ Console.WriteLine("Caught expected InvalidOperationException");
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("Caught unexpected exception!");
+ Console.WriteLine("Test2 Failed!");
+ passed = false;
+ }
+
+ try
+ {
+ Object o2 = gch.Target;
+ }
+ catch (InvalidOperationException)
+ {
+ Console.WriteLine("Caught expected InvalidOperationException");
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("Caught unexpected exception!");
+ Console.WriteLine("Test3 Failed!");
+ passed = false;
+ }
+
+ if (!passed)
+ {
+ Console.WriteLine("Test Failed!");
+ return 1;
+ }
+
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/Target_neg.csproj b/tests/src/GC/API/GCHandle/Target_neg.csproj
new file mode 100644
index 0000000000..0c843b09b6
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Target_neg.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Target_neg.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/ToFromIntPtr.cs b/tests/src/GC/API/GCHandle/ToFromIntPtr.cs
new file mode 100644
index 0000000000..520ca4db49
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/ToFromIntPtr.cs
@@ -0,0 +1,127 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*
+ * TEST: ToFromIntPtrTest
+ * DESCRIPTION: Added ToIntPtr and FromIntPtr methods to adhere to FXCop rule "OperatorOverloadsHaveNamedAlternativeMethods".
+ * See also Casting.cs test.
+ */
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Dummy
+{
+ public Dummy(int i)
+ {
+ this.i = i;
+ }
+ public int i;
+}
+
+
+public class ToFromIntPtrTest
+{
+ private int _numTests = 0;
+
+ private bool ToFromTest()
+ {
+ _numTests++;
+
+ int dummyValue = 101;
+
+ GCHandle gch = GCHandle.Alloc(new Dummy(dummyValue));
+ GCHandle gch2 = GCHandle.FromIntPtr(GCHandle.ToIntPtr(gch));
+
+ if (gch.Target == gch2.Target)
+ {
+ Console.WriteLine("ToFromTest Passed");
+ return true;
+ }
+
+ Console.WriteLine("ToFromTest Failed");
+ return false;
+ }
+
+
+ private bool FromZeroTest()
+ {
+ _numTests++;
+ try
+ {
+ GCHandle gch3 = GCHandle.FromIntPtr(IntPtr.Zero);
+ }
+ catch (InvalidOperationException)
+ {
+ Console.WriteLine("FromZeroTest Passed");
+ return true;
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Unexpected Exception:");
+ //Console.WriteLine(e);
+ }
+
+ Console.WriteLine("FromZeroTest Failed");
+ return false;
+ }
+
+
+ private bool ToZeroTest()
+ {
+ _numTests++;
+
+ GCHandle gch = GCHandle.Alloc(new Dummy(99));
+ gch.Free();
+ IntPtr intPtr = GCHandle.ToIntPtr(gch);
+
+ if (intPtr == IntPtr.Zero)
+ {
+ Console.WriteLine("ToZeroTest Passed");
+ return true;
+ }
+
+ Console.WriteLine("ToZeroTest Failed");
+ return false;
+ }
+
+
+ public bool RunTests()
+ {
+ int numPassed = 0;
+
+ if (ToFromTest())
+ {
+ numPassed++;
+ }
+
+ if (ToZeroTest())
+ {
+ numPassed++;
+ }
+
+ if (FromZeroTest())
+ {
+ numPassed++;
+ }
+
+ Console.WriteLine();
+ return (_numTests == numPassed);
+ }
+
+
+ public static int Main()
+ {
+ ToFromIntPtrTest t = new ToFromIntPtrTest();
+
+ if (t.RunTests())
+ {
+ Console.WriteLine("ToFromIntPtrTest Passed!");
+ return 100;
+ }
+
+ Console.WriteLine("ToFromIntPtrTest Failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/ToFromIntPtr.csproj b/tests/src/GC/API/GCHandle/ToFromIntPtr.csproj
new file mode 100644
index 0000000000..f083c125e6
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/ToFromIntPtr.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="ToFromIntPtr.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/Weak.cs b/tests/src/GC/API/GCHandle/Weak.cs
new file mode 100644
index 0000000000..8bcedd2f71
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Weak.cs
@@ -0,0 +1,68 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests GCHandleType.Weak .. the object with GCHandleType Weak
+// will be collected.
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+ public class Dummy
+ {
+ public static int flag = 0;
+ ~Dummy()
+ {
+ Console.WriteLine("In Finalize() of Dummy");
+ flag = 99;
+ }
+ }
+
+ public class CreateObj
+ {
+ public Dummy obj;
+
+ public CreateObj()
+ {
+ obj = new Dummy();
+ Console.WriteLine("Allocating a Weak handle to object..");
+ GCHandle handle = GCHandle.Alloc(obj, GCHandleType.Weak);
+ }
+
+ public bool RunTest()
+ {
+ // ensuring that GC happens even with /debug mode
+ obj = null;
+ GC.Collect();
+
+ GC.WaitForPendingFinalizers();
+
+ if (Dummy.flag == 99)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+
+ public static int Main()
+ {
+ CreateObj temp = new CreateObj();
+
+ if (temp.RunTest())
+ {
+ Console.WriteLine("Test for GCHandleType.Weak passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for GCHandleType.Weak failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/GCHandle/Weak.csproj b/tests/src/GC/API/GCHandle/Weak.csproj
new file mode 100644
index 0000000000..89c330b232
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/Weak.csproj
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Weak.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ <None Include="app.config" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandle/app.config b/tests/src/GC/API/GCHandle/app.config
new file mode 100644
index 0000000000..6f7bbd9d2b
--- /dev/null
+++ b/tests/src/GC/API/GCHandle/app.config
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/API/GCHandleCollector/Count.cs b/tests/src/GC/API/GCHandleCollector/Count.cs
new file mode 100644
index 0000000000..e24b99acf4
--- /dev/null
+++ b/tests/src/GC/API/GCHandleCollector/Count.cs
@@ -0,0 +1,224 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Count
+{
+ private int _totalTestCount = 0;
+
+
+ // count should be 0 by default
+ public bool EmptyTest()
+ {
+ _totalTestCount++;
+
+ HandleCollector hc = new HandleCollector(null, 1);
+
+ if (hc.Count != 0)
+ {
+ Console.WriteLine("EmptyTest Failed!");
+ return false;
+ }
+
+ Console.WriteLine("EmptyTest Passed!");
+ return true;
+ }
+
+
+ public bool AddTest()
+ {
+ _totalTestCount++;
+
+
+ HandleCollector hc = new HandleCollector(null, 1);
+
+ for (int i = 1; i <= 1000; i++)
+ {
+ hc.Add();
+ if (hc.Count != i)
+ {
+ Console.WriteLine("AddTest Failed!");
+ return false;
+ }
+ }
+
+ Console.WriteLine("AddTest Passed!");
+ return true;
+ }
+
+
+ public bool RemoveTest()
+ {
+ _totalTestCount++;
+
+
+ HandleCollector hc = new HandleCollector(null, 1);
+
+ for (int i = 1; i <= 1000; i++)
+ {
+ hc.Add();
+ }
+
+ for (int i = 999; i >= 0; i--)
+ {
+ hc.Remove();
+
+ if (hc.Count != i)
+ {
+ Console.WriteLine("RemoveTest Failed!");
+ return false;
+ }
+ }
+
+ Console.WriteLine("RemoveTest Passed!");
+ return true;
+ }
+
+
+
+ public bool StressTest()
+ {
+ _totalTestCount++;
+
+
+ HandleCollector hc = new HandleCollector(null, 1);
+
+ for (int i = 1; i <= 10000000; i++)
+ {
+ hc.Add();
+ if (hc.Count != i)
+ {
+ Console.WriteLine("StressTest1 Failed!");
+ return false;
+ }
+ }
+
+
+ for (int i = 9999999; i <= 0; i++)
+ {
+ hc.Remove();
+ if (hc.Count != i)
+ {
+ Console.WriteLine("StressTest2 Failed!");
+ return false;
+ }
+ }
+
+ Console.WriteLine("StressTest Passed!");
+ return true;
+ }
+
+
+
+ public bool MixedTest()
+ {
+ _totalTestCount++;
+
+
+ HandleCollector hc = new HandleCollector(null, 1);
+
+ int i, j, k;
+
+ for (i = 1; i <= 100; i++)
+ {
+ hc.Add();
+ if (hc.Count != i)
+ {
+ Console.WriteLine("MixedTest1 Failed!");
+ return false;
+ }
+ }
+
+ i--;
+
+ for (j = 1; j <= 50; j++)
+ {
+ hc.Remove();
+
+ if (hc.Count != i - j)
+ {
+ Console.WriteLine("MixedTest2 Failed!");
+ return false;
+ }
+ }
+
+ j--;
+
+ for (k = 1; k <= 50; k++)
+ {
+ hc.Add();
+ if (hc.Count != (i - j) + k)
+ {
+ Console.WriteLine("MixedTest3 Failed!");
+ return false;
+ }
+ }
+
+ k--;
+
+ // do check here
+ if (hc.Count != (i - j + k))
+ {
+ Console.WriteLine("MixedTest Failed!");
+ Console.WriteLine("Count: {0}", hc.Count);
+ Console.WriteLine("{0}", (i - j + k));
+ return false;
+ }
+
+ Console.WriteLine("MixedTest Passed!");
+ return true;
+ }
+
+
+ public bool RunTest()
+ {
+ int count = 0;
+
+ if (EmptyTest())
+ {
+ count++;
+ }
+
+ if (AddTest())
+ {
+ count++;
+ }
+
+ if (RemoveTest())
+ {
+ count++;
+ }
+
+
+ if (StressTest())
+ {
+ count++;
+ }
+
+ if (MixedTest())
+ {
+ count++;
+ }
+
+ Console.WriteLine();
+ return (count == _totalTestCount);
+ }
+
+
+ public static int Main()
+ {
+ Count c = new Count();
+
+ if (c.RunTest())
+ {
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GCHandleCollector/Count.csproj b/tests/src/GC/API/GCHandleCollector/Count.csproj
new file mode 100644
index 0000000000..26eba720cf
--- /dev/null
+++ b/tests/src/GC/API/GCHandleCollector/Count.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Count.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandleCollector/CtorsAndProperties.cs b/tests/src/GC/API/GCHandleCollector/CtorsAndProperties.cs
new file mode 100644
index 0000000000..adecf9cb72
--- /dev/null
+++ b/tests/src/GC/API/GCHandleCollector/CtorsAndProperties.cs
@@ -0,0 +1,128 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Handler
+{
+ private int _totalTestCount = 0;
+
+
+ public bool GetInitialThresholdTest()
+ {
+ _totalTestCount++;
+ int count = 0;
+
+ HandleCollector hc = null;
+
+ int[] initialValues = { 0, 1, 2, 3, 1000, 10000, Int32.MaxValue / 2, Int32.MaxValue };
+
+ foreach (int i in initialValues)
+ {
+ hc = new HandleCollector(null, i);
+ if (hc.InitialThreshold == i)
+ count++;
+ }
+
+ if (count != initialValues.Length)
+ {
+ Console.WriteLine("GetInitialThresholdTest Failed!");
+ return false;
+ }
+
+ return true;
+ }
+
+
+ public bool GetMaximumThresholdTest()
+ {
+ _totalTestCount++;
+ int count = 0;
+
+ HandleCollector hc = null;
+
+ int[] maxValues = { 0, 1, 2, 3, 1000, 10000, Int32.MaxValue / 2, Int32.MaxValue };
+
+ foreach (int i in maxValues)
+ {
+ hc = new HandleCollector(null, 0, i);
+ if (hc.MaximumThreshold == i)
+ count++;
+ }
+
+ if (count != maxValues.Length)
+ {
+ Console.WriteLine("GetMaximumThresholdTest Failed!");
+ return false;
+ }
+
+ return true;
+ }
+
+
+ public bool GetName()
+ {
+ _totalTestCount++;
+ int count = 0;
+
+ HandleCollector hc = null;
+
+ string[] names = { String.Empty, "a", "name", "name with spaces", new String('a', 50000), "\uA112\uA0E4\uA0F9" };
+
+ foreach (string s in names)
+ {
+ hc = new HandleCollector(s, 0);
+ if (hc.Name == s)
+ count++;
+ }
+
+ if (count != names.Length)
+ {
+ Console.WriteLine("GetNameTest Failed!");
+ return false;
+ }
+
+ return true;
+ }
+
+
+ public bool RunTest()
+ {
+ int count = 0;
+
+ if (GetInitialThresholdTest())
+ {
+ count++;
+ }
+
+ if (GetMaximumThresholdTest())
+ {
+ count++;
+ }
+
+ if (GetName())
+ {
+ count++;
+ }
+
+
+ return (count == _totalTestCount);
+ }
+
+
+ public static int Main()
+ {
+ Handler h = new Handler();
+
+ if (h.RunTest())
+ {
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GCHandleCollector/CtorsAndProperties.csproj b/tests/src/GC/API/GCHandleCollector/CtorsAndProperties.csproj
new file mode 100644
index 0000000000..964ece56c1
--- /dev/null
+++ b/tests/src/GC/API/GCHandleCollector/CtorsAndProperties.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="CtorsAndProperties.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandleCollector/NegTests.cs b/tests/src/GC/API/GCHandleCollector/NegTests.cs
new file mode 100644
index 0000000000..b1070d4540
--- /dev/null
+++ b/tests/src/GC/API/GCHandleCollector/NegTests.cs
@@ -0,0 +1,178 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Handler
+{
+ private int _totalTestCount = 0;
+
+ // tests various invalid constructor values
+ public bool ConstructorTest()
+ {
+ _totalTestCount++;
+
+ HandleCollector hc = null;
+ int count = 0;
+ int testcount = 0;
+
+ try
+ {
+ testcount++;
+ // negative maxThreshold
+ hc = new HandleCollector(null, 0, -1);
+ }
+ catch (System.ArgumentOutOfRangeException)
+ {
+ count++;
+ }
+
+ try
+ {
+ testcount++;
+ // negative initialThreshold
+ hc = new HandleCollector(null, -1, 0);
+ }
+ catch (System.ArgumentOutOfRangeException)
+ {
+ count++;
+ }
+
+ try
+ {
+ testcount++;
+ // negative maxThreshold & initialThreshold
+ hc = new HandleCollector(null, -1, -1);
+ }
+ catch (System.ArgumentOutOfRangeException)
+ {
+ count++;
+ }
+
+ try
+ {
+ testcount++;
+ // maxThreshold < initialThreshold
+ hc = new HandleCollector(null, 1, 0);
+ }
+ catch (System.ArgumentException)
+ {
+ count++;
+ }
+
+
+ if (count < testcount)
+ {
+ Console.WriteLine("ConstructorTest Failed!");
+ return false;
+ }
+
+
+ Console.WriteLine("ConstructorTest Passed!");
+ return true;
+ }
+
+
+ // should throw InvalidOperationException if removing when Count == 0
+ public bool RemoveTest()
+ {
+ _totalTestCount++;
+
+ HandleCollector hc = new HandleCollector(null, 1);
+
+ if (hc.Count != 0)
+ {
+ Console.WriteLine("Count value not zero: {0}!", hc.Count);
+ Console.WriteLine("RemoveTest Aborted!");
+ return false;
+ }
+
+ try
+ {
+ hc.Remove();
+ }
+ catch (InvalidOperationException)
+ {
+ Console.WriteLine("RemoveTest Passed!");
+ return true;
+ }
+
+ Console.WriteLine("RemoveTest Failed!");
+ return false;
+ }
+
+
+ // should throw InvalidOperationException if adding when Count == int.MaxValue
+ // unfortunately this test takes too long to run (~30 mins on a 1.8MHz machine)
+ public bool AddTest()
+ {
+ _totalTestCount++;
+
+ HandleCollector hc = new HandleCollector(null, int.MaxValue);
+
+ for (int i = 1; i < int.MaxValue; i++)
+ {
+ hc.Add();
+ if (hc.Count != i)
+ {
+ Console.WriteLine("AddTest Failed!1");
+ Console.WriteLine("i: {0}", i);
+ Console.WriteLine("count: {0}", hc.Count);
+ return false;
+ }
+ }
+
+ try
+ {
+ hc.Add(); // int.MaxValue+1
+ }
+ catch (InvalidOperationException)
+ {
+ Console.WriteLine("AddTest Passed!");
+ return true;
+ }
+
+ Console.WriteLine("AddTest Failed!2");
+ Console.WriteLine(hc.Count);
+ return false;
+ }
+
+
+ public bool RunTest()
+ {
+ int count = 0;
+
+ if (ConstructorTest())
+ {
+ count++;
+ }
+
+ if (RemoveTest())
+ {
+ count++;
+ }
+
+ // if (AddTest()) {
+ // count++;
+ // }
+
+ return (count == _totalTestCount);
+ }
+
+
+ public static int Main()
+ {
+ Handler h = new Handler();
+
+ if (h.RunTest())
+ {
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GCHandleCollector/NegTests.csproj b/tests/src/GC/API/GCHandleCollector/NegTests.csproj
new file mode 100644
index 0000000000..5b45c64c9a
--- /dev/null
+++ b/tests/src/GC/API/GCHandleCollector/NegTests.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="NegTests.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandleCollector/Usage.cs b/tests/src/GC/API/GCHandleCollector/Usage.cs
new file mode 100644
index 0000000000..14088f03de
--- /dev/null
+++ b/tests/src/GC/API/GCHandleCollector/Usage.cs
@@ -0,0 +1,226 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/* TEST: Usage
+ * DESCRIPTION: Three usage scenarios that monitor the number of live handles and GC Collections
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+// the class that holds the HandleCollectors
+public class HandleCollectorTest
+{
+ private static HandleCollector s_hc = new HandleCollector("hc", 100);
+
+ public HandleCollectorTest()
+ {
+ s_hc.Add();
+ }
+
+ public static int Count
+ {
+ get { return s_hc.Count; }
+ }
+
+ ~HandleCollectorTest()
+ {
+ s_hc.Remove();
+ }
+
+ public static void Reset()
+ {
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+ s_hc = new HandleCollector("hc", 100);
+ }
+}
+
+
+public class Usage
+{
+ private int _numTests = 0;
+ private int _numInstances = 100;
+ private const int deltaPercent = 10;
+
+ // ensures GC Collections occur when handle count exceeds maximum
+ private bool Case1()
+ {
+ _numTests++;
+
+ // clear GC
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ HandleCollectorTest h;
+ int original = GC.CollectionCount(0);
+
+ // create objects and let them go out of scope
+ for (int i = 0; i < _numInstances; i++)
+ h = new HandleCollectorTest();
+
+ h = null;
+ GC.WaitForPendingFinalizers();
+
+ // Collection should not have occurred
+ if (GC.CollectionCount(0) != original)
+ {
+ Console.WriteLine("Early collection!");
+ Console.WriteLine("Case 1 Failed!");
+ return false;
+ }
+
+ new HandleCollectorTest();
+
+ if ((GC.CollectionCount(0) - original) > 0)
+ {
+ Console.WriteLine("Case 1 Passed!");
+ return true;
+ }
+
+ Console.WriteLine("Expected collection did not occur!");
+ Console.WriteLine("Case 1 Failed!");
+ return false;
+ }
+
+ // ensures GC Collection does not occur when handle count stays below maximum
+ private bool Case2()
+ {
+ _numTests++;
+ int handleCount = 0;
+
+ for (int i = 0; i < _numInstances; i++)
+ {
+ new HandleCollectorTest();
+ GC.WaitForPendingFinalizers();
+ handleCount = HandleCollectorTest.Count;
+ //Note that the GC should occur when handle count is 101 but it will happen at anytime after a creation and we stick to the previous
+ //count to avoid error
+ }
+
+ Console.WriteLine("{0}, {1}", handleCount, _numInstances);
+
+ if (handleCount == _numInstances)
+ {
+ Console.WriteLine("Case 2 Passed!");
+ return true;
+ }
+
+ Console.WriteLine("Case 2 Failed!");
+ return false;
+ }
+
+
+ // ensures GC Collections frequency decrease by threshold
+ private bool Case3()
+ {
+ _numTests++;
+
+ int gcCount = GC.CollectionCount(2);
+ int handleCount = HandleCollectorTest.Count;
+ int prevHandleCount = HandleCollectorTest.Count;
+
+ List<HandleCollectorTest> list = new List<HandleCollectorTest>();
+
+ for (int i = 0; i < deltaPercent; i++)
+ {
+ do
+ {
+ HandleCollectorTest h = new HandleCollectorTest();
+ if ((HandleCollectorTest.Count % 2) == 0)
+ list.Add(h);
+ GC.WaitForPendingFinalizers();
+ if (GC.CollectionCount(2) != gcCount)
+ {
+ gcCount = GC.CollectionCount(2);
+ break;
+ }
+ else
+ handleCount = HandleCollectorTest.Count;
+ } while (true);
+
+ // ensure threshold is increasing
+ if (!CheckPercentageIncrease(handleCount, prevHandleCount))
+ {
+ Console.WriteLine("Case 3 failed: threshold not increasing!");
+ return false;
+ }
+ prevHandleCount = handleCount;
+ }
+
+
+ Console.WriteLine("Case 3 Passed!");
+ return true;
+ }
+
+
+ // Checks that the threshold increases are within 0.2 error margine of deltaPercent
+ private bool CheckPercentageIncrease(int current, int previous)
+ {
+ bool retValue = true;
+ if (previous != 0)
+ {
+ double value = ((double)(current - previous)) / (double)previous;
+ double expected = (double)deltaPercent / 100;
+ double errorMargin = Math.Abs((double)(value - expected) / (double)expected);
+ retValue = (errorMargin < 0.2);
+ }
+
+ return retValue;
+ }
+
+
+ public bool RunTest()
+ {
+ int numPassed = 0;
+
+ if (Case1())
+ {
+ numPassed++;
+ }
+
+ HandleCollectorTest.Reset();
+
+ if (Case2())
+ {
+ numPassed++;
+ }
+
+ HandleCollectorTest.Reset();
+
+ if (Case3())
+ {
+ numPassed++;
+ }
+
+ return (numPassed == _numTests);
+ }
+
+
+ public static int Main()
+ {
+ if (GC.CollectionCount(0) > 20)
+ {
+ Console.WriteLine("GC Stress is enabled");
+ Console.WriteLine("Abort Test");
+ return 100;
+ }
+
+ Usage u = new Usage();
+
+ if (u.RunTest())
+ {
+ Console.WriteLine();
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+
+ Console.WriteLine();
+ Console.WriteLine("Test Failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/GCHandleCollector/Usage.csproj b/tests/src/GC/API/GCHandleCollector/Usage.csproj
new file mode 100644
index 0000000000..486820655b
--- /dev/null
+++ b/tests/src/GC/API/GCHandleCollector/Usage.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Usage.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCHandleCollector/app.config b/tests/src/GC/API/GCHandleCollector/app.config
new file mode 100644
index 0000000000..6f7bbd9d2b
--- /dev/null
+++ b/tests/src/GC/API/GCHandleCollector/app.config
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/API/GCSettings/ILatencyTest.csproj b/tests/src/GC/API/GCSettings/ILatencyTest.csproj
index 558cf985db..fd69965bd6 100644
--- a/tests/src/GC/API/GCSettings/ILatencyTest.csproj
+++ b/tests/src/GC/API/GCSettings/ILatencyTest.csproj
@@ -31,8 +31,12 @@
<Compile Include="ILatencyTest.cs" />
</ItemGroup>
<ItemGroup>
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/API/GCSettings/InducedGen0GC.csproj b/tests/src/GC/API/GCSettings/InducedGen0GC.csproj
index fd3955138e..209a492594 100644
--- a/tests/src/GC/API/GCSettings/InducedGen0GC.csproj
+++ b/tests/src/GC/API/GCSettings/InducedGen0GC.csproj
@@ -31,8 +31,12 @@
<Compile Include="InducedGen0GC.cs" />
</ItemGroup>
<ItemGroup>
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/API/GCSettings/InducedGen1GC.csproj b/tests/src/GC/API/GCSettings/InducedGen1GC.csproj
index df1e8fb530..a97ec75f42 100644
--- a/tests/src/GC/API/GCSettings/InducedGen1GC.csproj
+++ b/tests/src/GC/API/GCSettings/InducedGen1GC.csproj
@@ -31,8 +31,12 @@
<Compile Include="InducedGen1GC.cs" />
</ItemGroup>
<ItemGroup>
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/API/GCSettings/InducedGen2GC.csproj b/tests/src/GC/API/GCSettings/InducedGen2GC.csproj
index b8a35165d5..1f4cd32c9e 100644
--- a/tests/src/GC/API/GCSettings/InducedGen2GC.csproj
+++ b/tests/src/GC/API/GCSettings/InducedGen2GC.csproj
@@ -31,8 +31,12 @@
<Compile Include="InducedGen2GC.cs" />
</ItemGroup>
<ItemGroup>
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/API/GCSettings/InputValidation.cs b/tests/src/GC/API/GCSettings/InputValidation.cs
new file mode 100644
index 0000000000..ea01ab78d9
--- /dev/null
+++ b/tests/src/GC/API/GCSettings/InputValidation.cs
@@ -0,0 +1,147 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Runtime;
+
+//Testing what GC Latency Modes can be set, depending on what is the original GC setting
+public class InputValidation
+{
+ static GCLatencyMode initialMode = GCSettings.LatencyMode;
+ static bool server = false;
+ static bool nonConcurrent = false;
+
+ public static int Main()
+ {
+ //Detect on what config we are running
+ if (!DetectInitialMode())
+ return 25;
+
+ InputValidationTest test = new InputValidationTest(server, nonConcurrent);
+
+ return test.Run();
+
+ }
+
+ static bool DetectInitialMode()
+ {
+ if (System.Runtime.GCSettings.IsServerGC)
+ {
+ Console.Write("Server GC ");
+ server = true;
+ }
+ else
+ {
+ Console.Write("Workstation ");
+ }
+
+
+ if (initialMode == GCLatencyMode.Batch)
+ {
+ nonConcurrent = true;
+ Console.WriteLine("Non Concurrent ");
+ }
+ else if (initialMode == GCLatencyMode.Interactive)
+ {
+ Console.WriteLine("Concurrent ");
+ }
+ else
+ {
+ Console.WriteLine("Unexpected GC mode");
+ return false;
+ }
+ return true;
+ }
+
+ class InputValidationTest
+ {
+
+ public List<GCLatencyMode> totalInputs = new List<GCLatencyMode>(new GCLatencyMode[] { GCLatencyMode.Batch, GCLatencyMode.Interactive, GCLatencyMode.LowLatency, GCLatencyMode.SustainedLowLatency });
+ public List<GCLatencyMode> validInputs = new List<GCLatencyMode>();
+ public List<GCLatencyMode> invalidInputs = new List<GCLatencyMode>();
+ public List<GCLatencyMode> outOfRangeInputs = new List<GCLatencyMode>(new GCLatencyMode[] { (GCLatencyMode)(GCLatencyMode.Batch - 1), (GCLatencyMode)(GCLatencyMode.SustainedLowLatency + 1) });
+
+ public InputValidationTest(bool server, bool nonconcurrent)
+ {
+ //set the valid inputs and invalid inputs
+ if (server)
+ {
+ invalidInputs.Add(GCLatencyMode.LowLatency);
+ }
+ if (nonConcurrent)
+ {
+ invalidInputs.Add(GCLatencyMode.SustainedLowLatency);
+ }
+ foreach (GCLatencyMode latency in totalInputs)
+ {
+ if (!invalidInputs.Contains(latency))
+ validInputs.Add(latency);
+ }
+ }
+
+ public int Run()
+ {
+ int errorCount = 0;
+ Console.WriteLine("Initial mode is {0}", initialMode);
+ for (int i = 0; i < validInputs.Count; i++)
+ {
+ Console.WriteLine("Setting latency mode to {0}", validInputs[i]);
+ GCSettings.LatencyMode = validInputs[i];
+
+ if (GCSettings.LatencyMode != validInputs[i])
+ {
+ Console.WriteLine("{0} Latency mode doesn't match", validInputs[i]);
+ errorCount++;
+ }
+ GCSettings.LatencyMode = initialMode;
+ }
+
+ for (int i = 0; i < outOfRangeInputs.Count; i++)
+ {
+ try
+ {
+ Console.WriteLine("Setting latency mode to {0}", outOfRangeInputs[i]);
+ GCSettings.LatencyMode = outOfRangeInputs[i];
+ Console.WriteLine("Should not have been able to set latency mode to {0}", invalidInputs[i]);
+ errorCount++;
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ Console.WriteLine("ArgumentOutOfRangeException (expected)");
+ }
+ }
+
+ GCSettings.LatencyMode = initialMode;
+ for (int i = 0; i < invalidInputs.Count; i++)
+ {
+ Console.WriteLine("Setting latency mode to {0}", invalidInputs[i]);
+ GCSettings.LatencyMode = invalidInputs[i];
+
+ if (GCSettings.LatencyMode != initialMode)
+ {
+ Console.WriteLine("Latency mode should not have changed to {0}", GCSettings.LatencyMode);
+ errorCount++;
+ }
+ GCSettings.LatencyMode = initialMode;
+ }
+
+ if (errorCount > 0)
+ {
+ Console.WriteLine("{0} errors", errorCount);
+ Console.WriteLine("Test Failed");
+ return errorCount;
+ }
+ Console.WriteLine("Test Passed");
+ return 100;
+
+ }
+
+ }
+
+}
+
+
+
+
diff --git a/tests/src/GC/API/GCSettings/InputValidation.csproj b/tests/src/GC/API/GCSettings/InputValidation.csproj
new file mode 100644
index 0000000000..bdf3f93f96
--- /dev/null
+++ b/tests/src/GC/API/GCSettings/InputValidation.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="InputValidation.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/GCSettings/app.config b/tests/src/GC/API/GCSettings/app.config
new file mode 100644
index 0000000000..6f7bbd9d2b
--- /dev/null
+++ b/tests/src/GC/API/GCSettings/app.config
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/API/WeakReference/Finalize.cs b/tests/src/GC/API/WeakReference/Finalize.cs
new file mode 100644
index 0000000000..d8732308da
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/Finalize.cs
@@ -0,0 +1,67 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests WeakReference.Finalize()
+
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test {
+
+ public class Dummy {
+
+ public static bool visited=false;
+ ~Dummy() {
+ Console.WriteLine("In Finalize() of Dummy");
+ if(visited==false) visited=true;
+ else visited=false;
+ }
+ }
+
+ public class CreateObj {
+ Dummy dummy1;
+ Dummy dummy2;
+
+ public CreateObj() {
+ dummy1 = new Dummy();
+ dummy2 = new Dummy();
+ }
+
+ public bool RunTest() {
+
+ WeakReference weak1 = new WeakReference(dummy1);
+ GCHandle handle = GCHandle.Alloc(dummy1,GCHandleType.Normal); // Strong Reference
+
+ WeakReference weak2 = new WeakReference(dummy2); // only a weak reference..so should run finalizer
+
+ // ensuring that GC happens even with /debug mode
+ dummy1=null;
+ dummy2=null;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ if(Dummy.visited == true)
+ return true;
+ else
+ return false;
+ }
+ }
+
+ public static int Main() {
+
+ CreateObj temp = new CreateObj();
+ bool passed = temp.RunTest();
+
+ if(passed) {
+ Console.WriteLine("Test for WeakReference.Finalize() passed!");
+ return 100;
+ }
+ else {
+ Console.WriteLine("Test for WeakReference.Finalize() failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/WeakReference/Finalize.csproj b/tests/src/GC/API/WeakReference/Finalize.csproj
new file mode 100644
index 0000000000..5184a71b54
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/Finalize.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Finalize.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/WeakReference/Finalize2.cs b/tests/src/GC/API/WeakReference/Finalize2.cs
new file mode 100644
index 0000000000..84aa27bafb
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/Finalize2.cs
@@ -0,0 +1,185 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*
+ * TEST NAME: Finalize2
+ * DESCRIPTION: operates on Weakhandles whose targets are being finalized
+ */
+
+using System;
+
+public class GetTargetTest
+{
+ public WeakReference w;
+ static public bool Passed = false;
+
+ public GetTargetTest(bool trackResurrection)
+ {
+ w = new WeakReference(this, trackResurrection);
+ }
+
+ ~GetTargetTest()
+ {
+ Console.WriteLine("Running ~GetTargetTest");
+ // target is being finalized. Internal handle should be null
+ try
+ {
+ Object o = w.Target;
+ if (o == null)
+ {
+ Console.WriteLine("getTarget passed");
+ Console.WriteLine();
+ Passed = true;
+ return;
+ }
+ GC.KeepAlive(o);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ }
+
+ Console.WriteLine("getTarget failed");
+ Console.WriteLine();
+ }
+}
+
+public class SetTargetTest
+{
+ public WeakReference w;
+ static public bool Passed = false;
+
+ public SetTargetTest(bool trackResurrection)
+ {
+ w = new WeakReference(this, trackResurrection);
+ }
+
+ ~SetTargetTest()
+ {
+ // target is being finalized. Internal handle should be null
+ Console.WriteLine("Running ~SetTargetTest");
+
+ try
+ {
+ w.Target = new Object();
+ }
+ catch (InvalidOperationException)
+ {
+ Console.WriteLine("Caught expected InvalidOperationException");
+ Console.WriteLine("setTarget passed");
+ Console.WriteLine();
+ Passed = true;
+ return;
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ }
+
+ Console.WriteLine("setTarget failed");
+ Console.WriteLine();
+ }
+}
+
+public class IsAliveTest
+{
+ public WeakReference w;
+ static public bool Passed = false;
+
+ public IsAliveTest(bool trackResurrection)
+ {
+ w = new WeakReference(this, trackResurrection);
+ }
+
+ ~IsAliveTest()
+ {
+ Console.WriteLine("Running ~IsAliveTest");
+ // target is being finalized. Internal handle should be null
+
+ try
+ {
+ bool b = w.IsAlive;
+
+ if (!b)
+ {
+ Console.WriteLine("IsAliveTest passed");
+ Console.WriteLine();
+ Passed = true;
+ return;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ }
+
+ Console.WriteLine("IsAlive failed");
+ Console.WriteLine();
+ }
+}
+
+public class NullHandle
+{
+ public bool RunTests(bool trackResurrection)
+ {
+ GetTargetTest d1 = new GetTargetTest(trackResurrection);
+ SetTargetTest d2 = new SetTargetTest(trackResurrection);
+ IsAliveTest d3 = new IsAliveTest(trackResurrection);
+
+ // make sure Finalizers are called
+ d1 = null;
+ d2 = null;
+ d3 = null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ Console.WriteLine();
+
+ return ((GetTargetTest.Passed) && (SetTargetTest.Passed) && (IsAliveTest.Passed));
+ }
+
+
+ public static int Main()
+ {
+ NullHandle t = new NullHandle();
+ bool longPassed = false;
+ bool shortPassed = false;
+
+ if (t.RunTests(false))
+ {
+ Console.WriteLine("Short WR Test Passed!");
+ shortPassed = true;
+ }
+ else
+ {
+ Console.WriteLine("Short WR Test Failed!");
+ }
+
+ Console.WriteLine();
+ Console.WriteLine();
+
+ if (t.RunTests(true))
+ {
+ Console.WriteLine("Long WR Test Passed!");
+ longPassed = true;
+ }
+ else
+ {
+ Console.WriteLine("Long WR Test Failed!");
+ }
+
+ Console.WriteLine();
+ Console.WriteLine();
+
+ if (longPassed && shortPassed)
+ {
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/WeakReference/Finalize2.csproj b/tests/src/GC/API/WeakReference/Finalize2.csproj
new file mode 100644
index 0000000000..ead3f9fd33
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/Finalize2.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Finalize2.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/WeakReference/IsAlive.cs b/tests/src/GC/API/WeakReference/IsAlive.cs
new file mode 100644
index 0000000000..fae70e1e8a
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/IsAlive.cs
@@ -0,0 +1,41 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests WeakReference.IsAlive : IsAlive=true if GC has not occurred on the object
+
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test {
+ public static int Main() {
+ int[] array = new int[50];
+
+ WeakReference weak = new WeakReference(array);
+
+ bool ans1 = weak.IsAlive;
+ Console.WriteLine(ans1);
+
+ if(ans1==false) { // GC.Collect() has already occurred..under GCStress
+ Console.WriteLine("Test for WeakReference.IsAlive passed!");
+ return 100;
+ }
+
+ //else, do an expicit collect.
+ array=null;
+ GC.Collect();
+
+ bool ans2 = weak.IsAlive;
+ Console.WriteLine(ans2);
+
+ if((ans1 == true) && (ans2==false)) {
+ Console.WriteLine("Test for WeakReference.IsAlive passed!");
+ return 100;
+ }
+ else {
+ Console.WriteLine("Test for WeakReference.IsAlive failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/WeakReference/IsAlive.csproj b/tests/src/GC/API/WeakReference/IsAlive.csproj
new file mode 100644
index 0000000000..e74d92c4c9
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/IsAlive.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="IsAlive.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/WeakReference/IsAlive_neg.cs b/tests/src/GC/API/WeakReference/IsAlive_neg.cs
new file mode 100644
index 0000000000..31ce677e38
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/IsAlive_neg.cs
@@ -0,0 +1,34 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Negative Test for WeakReference.IsAlive
+// IsAlive=false if GC occurs on object with only a weakreference.
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test {
+ public static int Main() {
+ int[] array = new int[50];
+
+ WeakReference weak = new WeakReference(array); // array has ONLY a weakreference
+
+ // ensuring that GC happens even with /debug mode
+ array=null;
+
+ GC.Collect();
+
+ bool ans = weak.IsAlive;
+ Console.WriteLine(ans);
+
+ if(ans == false) {
+ Console.WriteLine("Negative Test for WeakReference.IsAlive passed!");
+ return 100;
+ }
+ else {
+ Console.WriteLine("Negative Test for WeakReference.IsAlive failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/WeakReference/IsAlive_neg.csproj b/tests/src/GC/API/WeakReference/IsAlive_neg.csproj
new file mode 100644
index 0000000000..db81ae84cf
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/IsAlive_neg.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="IsAlive_neg.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/WeakReference/NullHandle.cs b/tests/src/GC/API/WeakReference/NullHandle.cs
new file mode 100644
index 0000000000..eb9cf61b4b
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/NullHandle.cs
@@ -0,0 +1,98 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*
+ * TEST NAME: NullHandle
+ * DESCRIPTION: operates on Weakhandles whose m_handle is null
+ */
+
+using System;
+using System.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
+
+public class WR : WeakReference
+{
+ public WR(Object o) : base(o, false) { }
+
+ ~WR()
+ {
+ Console.WriteLine("Resurrected!");
+ Test.w = this;
+ }
+}
+
+public class Test
+{
+ public static WR w;
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static WR ReturnWR() { return new WR(new Object()); }
+
+ public static int Main()
+ {
+ int numTests = 0;
+ int numPassed = 0;
+ WR wr = ReturnWR();
+ wr = null;
+
+ // this will resurrect wr
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ try
+ {
+ numTests++;
+ Console.WriteLine("Get Target Test");
+ Console.WriteLine(Test.w.Target);
+ Console.WriteLine("Passed");
+ numPassed++;
+ }
+
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ }
+
+ try
+ {
+ numTests++;
+ Console.WriteLine("IsAlive Test");
+ bool b = Test.w.IsAlive;
+ Console.WriteLine(b);
+
+ if (!b)
+ {
+ Console.WriteLine("Passed");
+ numPassed++;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ }
+
+ try
+ {
+ numTests++;
+ Console.WriteLine("Set Target Test");
+ Test.w.Target = new Object();
+ }
+ catch (InvalidOperationException)
+ {
+ numPassed++;
+ Console.WriteLine("Passed");
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ }
+
+ if (numTests == numPassed)
+ {
+ return 100;
+ }
+
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/WeakReference/NullHandle.csproj b/tests/src/GC/API/WeakReference/NullHandle.csproj
new file mode 100644
index 0000000000..8d236fe676
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/NullHandle.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="NullHandle.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/WeakReference/Target.cs b/tests/src/GC/API/WeakReference/Target.cs
new file mode 100644
index 0000000000..f30c3535d8
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/Target.cs
@@ -0,0 +1,99 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests WeakReference.Target
+// Retrieves or assigns the object an IsAlive status.
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Dummy
+{
+ public int val = 0;
+
+ public Dummy(int val)
+ {
+ this.val = val;
+ }
+}
+
+public class Test
+{
+ public bool GetTargetTest()
+ {
+ int[] array = new int[50];
+ Object[] obj = new Object[25];
+
+ WeakReference weakarray = new WeakReference(array); // array has only weak reference
+
+ // obj has both strong and weak ref and so should not get collected
+
+ WeakReference weakobj = new WeakReference(obj);
+ GCHandle objhandle = GCHandle.Alloc(obj, GCHandleType.Normal);
+
+ // ensuring GC.Collect() occurs even with /debug option
+ array = null;
+ obj = null;
+
+ GC.Collect();
+
+ Object target1 = weakarray.Target; // should be null
+ Object target2 = weakobj.Target; // should be System.Object[]
+
+ Console.WriteLine("{0},{1}", target1, target2);
+
+ if ((target1 == null) && (target2 != null))
+ {
+ Console.WriteLine("Test for WeakReference.get_Target passed!");
+ return true;
+ }
+ else
+ {
+ Console.WriteLine("Test for WeakReference.get_Target failed!");
+ return false;
+ }
+ }
+
+ public bool SetTargetTest()
+ {
+ Dummy d1 = new Dummy(99);
+ Dummy d2 = new Dummy(66);
+
+ WeakReference wr = new WeakReference(d1); // array has only weak reference
+ wr.Target = d2; // overwrite wr.Target with d2
+ Dummy d3 = (Dummy)wr.Target; // get wr.Target
+ GC.KeepAlive(d2); // required so d2 doesn't get collected before setting d3
+
+ if (d3.val == 66)
+ {
+ // make sure d3 == d2, not d1
+ Console.WriteLine("Test for WeakReference.set_Target passed!");
+ return true;
+ }
+ else
+ {
+ Console.WriteLine("Test for WeakReference.set_Target failed!");
+ return false;
+ }
+ }
+
+ public static int Main()
+ {
+ bool passed1, passed2;
+
+ Test t = new Test();
+
+ passed1 = t.GetTargetTest();
+ passed2 = t.SetTargetTest();
+
+ if (passed1 && passed2)
+ {
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed!");
+ return 1;
+ }
+}
diff --git a/tests/src/GC/API/WeakReference/Target.csproj b/tests/src/GC/API/WeakReference/Target.csproj
new file mode 100644
index 0000000000..53825f8492
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/Target.csproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants);DESKTOP</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="Target.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/WeakReference/TrackResurrection.cs b/tests/src/GC/API/WeakReference/TrackResurrection.cs
new file mode 100644
index 0000000000..ea99f159ab
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/TrackResurrection.cs
@@ -0,0 +1,38 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests WeakReference.TrackResurrection
+// Retrieves a boolean indicating whether objects are tracked.
+
+// TRUE: The reference will refer to the target until it is reclaimed by the Runtime
+// (until collection).
+// FALSE: The reference will refer to the target until the first time it is detected
+// to be unreachable by Runtime (until Finalization).
+
+
+using System;
+
+public class Test {
+ public static int Main() {
+ int[] array = new int[50];
+ Object obj = new Object();
+
+ WeakReference weak1 = new WeakReference(array,true);
+ WeakReference weak2 = new WeakReference(obj,false);
+
+
+ bool ans1 = weak1.TrackResurrection;
+ bool ans2 = weak2.TrackResurrection;
+
+
+ if((ans1 == true) && (ans2 == false)) {
+ Console.WriteLine("Test for WeakReference.TrackResurrection passed!");
+ return 100;
+ }
+ else {
+ Console.WriteLine("Test for WeakReference.TrackResurrection failed!");
+ return 1;
+ }
+ }
+}
diff --git a/tests/src/GC/API/WeakReference/TrackResurrection.csproj b/tests/src/GC/API/WeakReference/TrackResurrection.csproj
new file mode 100644
index 0000000000..27e745ccc6
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/TrackResurrection.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments></CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="TrackResurrection.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/WeakReference/app.config b/tests/src/GC/API/WeakReference/app.config
new file mode 100644
index 0000000000..6f7bbd9d2b
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/app.config
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/API/WeakReference/multipleWRs.cs b/tests/src/GC/API/WeakReference/multipleWRs.cs
new file mode 100644
index 0000000000..e4c266f525
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/multipleWRs.cs
@@ -0,0 +1,94 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+
+public class Test
+{
+
+ List<byte[]> strongRefs;
+ List<WeakReference> weakRefs;
+
+ public Test(int numElems, bool track)
+ {
+ strongRefs = new List<byte[]>();
+ weakRefs = new List<WeakReference>();
+
+ for (int i = 0; i < numElems; i++)
+ {
+ byte[] data = new byte[1000];
+ data[0] = 0xC;
+
+ strongRefs.Add(data);
+ weakRefs.Add(new WeakReference(data, track));
+ }
+ }
+
+
+ public int Calculate()
+ {
+ int count = 0;
+ foreach (WeakReference w in weakRefs)
+ {
+ if (w.Target!=null)
+ {
+ ++count;
+ }
+ }
+ return count;
+ }
+
+
+ public static void Usage()
+ {
+ Console.WriteLine("USAGE: MultipleWR.exe <num objects> [track]");
+ }
+
+
+ public static int Main(string[] args)
+ {
+
+ int numElems = 0;
+ if ((args.Length==0) || (!Int32.TryParse(args[0], out numElems)))
+ {
+ Usage();
+ return 1;
+ }
+
+ bool track = false;
+ if (args.Length==2)
+ {
+ track = (args[1].ToLower()=="track");
+ }
+
+
+
+ Test test = new Test(numElems, track);
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ int count = test.Calculate();
+
+ Console.WriteLine("Number of live references: {0}", numElems);
+ Console.WriteLine("Number of live WeakReferences: {0}", count);
+
+ // this KeepAlive is necessary so test isn't collected before we get the weakreference count
+ GC.KeepAlive(test);
+
+ if (count!=numElems)
+ {
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+ Console.WriteLine("Test Passed");
+ return 100;
+
+ }
+
+}
+
diff --git a/tests/src/GC/API/WeakReference/multipleWRs.csproj b/tests/src/GC/API/WeakReference/multipleWRs.csproj
new file mode 100644
index 0000000000..16a79a9b4f
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/multipleWRs.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>10000</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="multipleWRs.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/API/WeakReference/multipleWRs_1.csproj b/tests/src/GC/API/WeakReference/multipleWRs_1.csproj
new file mode 100644
index 0000000000..9c79fb2391
--- /dev/null
+++ b/tests/src/GC/API/WeakReference/multipleWRs_1.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>10000 track</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="multipleWRs.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/Coverage/271010.cs b/tests/src/GC/Coverage/271010.cs
new file mode 100644
index 0000000000..64c1a19d27
--- /dev/null
+++ b/tests/src/GC/Coverage/271010.cs
@@ -0,0 +1,34 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/* DESCRIPTION: regression test for VSWhidbey 271010
+ * Should throw OOM
+ */
+
+using System;
+using System.Runtime.CompilerServices;
+
+public class Test {
+
+ public static int Main() {
+
+ int[][] otherarray;
+
+ try
+ {
+ otherarray = new int[16384][];
+ for(int i=0;i<16384;i++)
+ {
+ otherarray[i] = new int[1024*500];
+ }
+ }
+ catch (System.OutOfMemoryException)
+ {
+ otherarray = null;
+ return 100;
+ }
+ return 1;
+
+ }
+}
diff --git a/tests/src/GC/Coverage/271010.csproj b/tests/src/GC/Coverage/271010.csproj
new file mode 100644
index 0000000000..60bb1b8dbb
--- /dev/null
+++ b/tests/src/GC/Coverage/271010.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="271010.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Coverage/LargeObjectAlloc.csproj b/tests/src/GC/Coverage/LargeObjectAlloc.csproj
index f9152b3369..0784021a6a 100644
--- a/tests/src/GC/Coverage/LargeObjectAlloc.csproj
+++ b/tests/src/GC/Coverage/LargeObjectAlloc.csproj
@@ -30,8 +30,13 @@
<Compile Include="LargeObjectAlloc.cs" />
</ItemGroup>
<ItemGroup>
- <None Include="project.json" />
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Coverage/LargeObjectAlloc2.csproj b/tests/src/GC/Coverage/LargeObjectAlloc2.csproj
index 1ccf3205b8..ea304efc6d 100644
--- a/tests/src/GC/Coverage/LargeObjectAlloc2.csproj
+++ b/tests/src/GC/Coverage/LargeObjectAlloc2.csproj
@@ -30,8 +30,12 @@
<Compile Include="LargeObjectAlloc2.cs" />
</ItemGroup>
<ItemGroup>
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Coverage/app.config b/tests/src/GC/Coverage/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Coverage/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Coverage/concurrentspin2.cs b/tests/src/GC/Coverage/concurrentspin2.cs
new file mode 100644
index 0000000000..23edb8bb34
--- /dev/null
+++ b/tests/src/GC/Coverage/concurrentspin2.cs
@@ -0,0 +1,184 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Diagnostics;
+using System.Threading;
+
+class PriorityTest
+{
+ private byte[][] old;
+ private byte[][] med;
+ private Random rand;
+
+ private int oldDataSize;
+ private int medDataSize;
+ private int iterCount;
+ private int meanAllocSize;
+ private int medTime;
+ private int youngTime;
+
+
+ public PriorityTest(int oldDataSize, int medDataSize,
+ int iterCount, int meanAllocSize,
+ int medTime, int youngTime)
+ {
+ rand = new Random(314159);
+ this.oldDataSize = oldDataSize;
+ this.medDataSize = medDataSize;
+ this.iterCount = iterCount;
+ this.meanAllocSize = meanAllocSize;
+ this.medTime = medTime;
+ this.youngTime = youngTime;
+ }
+
+ // creates initial arrays
+ void AllocTest(int oldDataSize, int medDataSize, int meanAllocSize)
+ {
+ old = new byte[oldDataSize][];
+ med = new byte[medDataSize][];
+
+ for (int i = 0; i < old.Length; i++)
+ {
+ old[i] = new byte[meanAllocSize];
+ }
+
+ for (int i = 0; i < med.Length; i++)
+ {
+ med[i] = new byte[meanAllocSize];
+ }
+ }
+
+ // churns data in the heap by replacing byte arrays with new ones of random length
+ // this should induce concurrent GCs
+ void SteadyState(int oldDataSize, int medDataSize,
+ int iterCount, int meanAllocSize,
+ int medTime, int youngTime)
+ {
+
+ for (int i = 0; i < iterCount; i++)
+ {
+ byte[] newarray = new byte[meanAllocSize];
+
+ if ((i % medTime) == 0)
+ {
+ old[rand.Next(0, old.Length)] = newarray;
+ }
+ if ((i % youngTime) == 0)
+ {
+ med[rand.Next(0, med.Length)] = newarray;
+ }
+ //if (((i % 5000) == 0) && (Thread.CurrentThread.Priority != ThreadPriority.Lowest))
+ //{
+ // Thread.Sleep(200);
+ //}
+ }
+ }
+
+ // method that runs the test
+ public void RunTest()
+ {
+ for (int iteration = 0; iteration < iterCount; iteration++)
+ {
+ AllocTest(oldDataSize, medDataSize, meanAllocSize);
+
+ SteadyState(oldDataSize, medDataSize,
+ iterCount, meanAllocSize,
+ medTime, youngTime);
+
+ if (((iteration + 1) % 20) == 0)
+ Console.WriteLine("Thread: {1} Finished iteration {0}", iteration, System.Threading.Thread.CurrentThread.Name);
+ }
+
+ }
+
+}
+
+
+class ConcurrentRepro
+{
+
+ public static void Usage()
+ {
+ Console.WriteLine("Usage:");
+ Console.WriteLine("\t<num iterations> <num threads>");
+ }
+
+ public static int[] ParseArgs(string[] args)
+ {
+ int[] parameters = new int[2];
+
+ // set defaults
+ parameters[0] = 100;
+ parameters[1] = 4;
+
+ if (args.Length == 0)
+ {
+ //use defaults
+ Console.WriteLine("Using defaults: 100 iterations, 4 threads");
+ return parameters;
+ }
+ if (args.Length == parameters.Length)
+ {
+ for (int i = 0; i < args.Length; i++)
+ {
+ int j = 0;
+ if (!int.TryParse(args[i], out j))
+ {
+ Usage();
+ return null;
+ }
+ parameters[i] = j;
+ }
+
+ return parameters;
+ }
+
+ // incorrect number of arguments
+ Usage();
+ return null;
+ }
+
+
+ public static int Main(string[] args)
+ {
+
+ // parse arguments
+ int[] parameters = ParseArgs(args);
+ if (parameters == null)
+ {
+ return 0;
+ }
+
+ // set process affinity to 1 to repro bug easier
+ //Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)1;
+
+
+ PriorityTest priorityTest = new PriorityTest(1000000, 5000, parameters[0], 17, 30, 3);
+ ThreadStart startDelegate = new ThreadStart(priorityTest.RunTest);
+
+ // create threads
+ Thread[] threads = new Thread[parameters[1]];
+ for (int i = 0; i < threads.Length; i++)
+ {
+ threads[i] = new Thread(startDelegate);
+ threads[i].Name = String.Format("Thread{0}", i);
+ //if (i % 2 == 0)
+ //{
+ // threads[i].Priority = ThreadPriority.Lowest;
+ //}
+ threads[i].Start();
+ }
+
+ // wait for threads to complete
+ for (int i = 0; i < threads.Length; i++)
+ {
+ threads[i].Join();
+ }
+
+ return 100;
+ }
+}
+
+
diff --git a/tests/src/GC/Coverage/concurrentspin2.csproj b/tests/src/GC/Coverage/concurrentspin2.csproj
new file mode 100644
index 0000000000..7e63affeba
--- /dev/null
+++ b/tests/src/GC/Coverage/concurrentspin2.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="ConcurrentSpin2.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Coverage/delete_next_card_table.cs b/tests/src/GC/Coverage/delete_next_card_table.cs
new file mode 100644
index 0000000000..ad0bd5ca3f
--- /dev/null
+++ b/tests/src/GC/Coverage/delete_next_card_table.cs
@@ -0,0 +1,63 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/* TEST: delete_next_card_table
+ * DESCRIPTION: gains 14 blocks in gc.cpp
+ mscorwks!WKS::delete_next_card_table: (7 blocks, 11 arcs)
+ mscorwks!SVR::delete_next_card_table: (7 blocks, 11 arcs)
+ */
+
+using System;
+using System.Collections;
+
+public class delete_next_card_table
+{
+ public static int Main()
+ {
+ new delete_next_card_table().DoMemoryChurn();
+ return 100;
+ }
+
+ // this function attempts to allocate & free large amounts
+ // of memory to ensure our objects remain pinned, don't get
+ // relocated, etc...
+ void DoMemoryChurn()
+ {
+
+ Random r = new Random();
+ for (int j = 0; j < 10; j++)
+ {
+ Console.Write("Churn loop {0}", j);
+
+ try
+ {
+ // arraylist keeps everything rooted until we run out of memory
+ //ArrayList al = new ArrayList();
+ object[] objArray = new object[32];
+ int len = 1;
+
+ for (int i = 0; i < 32; i++) // todo: this should be based upon size of IntPtr (32 bits on 32 bit platforms, 64 on 64 bit platforms)
+ {
+ Console.Write(".");
+
+ if (i < 30)
+ {
+ // Random.Next cannot handle negative (0x80000000) numbers
+ len *= 2;
+ }
+ //al.Add(new Guid[len + r.Next(len)]);
+ objArray[i] = new Guid[len + r.Next(len)];
+ }
+ }
+ catch (OutOfMemoryException)
+ {
+ Console.WriteLine("OOM while Churning");
+ GC.Collect();
+ }
+
+ Console.WriteLine();
+ }
+ }
+}
+
diff --git a/tests/src/GC/Coverage/delete_next_card_table.csproj b/tests/src/GC/Coverage/delete_next_card_table.csproj
new file mode 100644
index 0000000000..bd6d96f975
--- /dev/null
+++ b/tests/src/GC/Coverage/delete_next_card_table.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="delete_next_card_table.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Coverage/smalloom.cs b/tests/src/GC/Coverage/smalloom.cs
new file mode 100644
index 0000000000..a640c30c9d
--- /dev/null
+++ b/tests/src/GC/Coverage/smalloom.cs
@@ -0,0 +1,72 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//Regression test for Dev 10 bug 479239: GC hangs on x86 rather than throwing OOM
+
+using System;
+using System.Runtime;
+
+class TestClass
+{
+ public static int Main()
+ {
+ ByteArrayList list = new ByteArrayList();
+
+
+ try
+ {
+ while (true)
+ {
+ list.AddByteArray(84500);
+ }
+ }
+ catch (OutOfMemoryException)
+ {
+ }
+
+ Console.Write("NodesAllocated: ");
+ Console.WriteLine(list.NodeCount);
+ return 100;
+ }
+
+ class ByteArrayList
+ {
+ class Node
+ {
+ byte[] data = null;
+ int size = 0;
+ public Node next = null;
+
+ public Node(int Size)
+ {
+ data = new byte[Size];
+ size = Size;
+ }
+
+ }
+
+ Node head;
+
+ public int NodeCount = 0;
+ public ByteArrayList()
+ {
+ head = null;
+ }
+
+ public void AddByteArray(int size)
+ {
+ Node newNode = new Node(size);
+
+ if (head == null)
+ head = newNode;
+ else
+ {
+ newNode.next = head;
+ head = newNode;
+ }
+ NodeCount++;
+ }
+ }
+
+} \ No newline at end of file
diff --git a/tests/src/GC/Coverage/smalloom.csproj b/tests/src/GC/Coverage/smalloom.csproj
new file mode 100644
index 0000000000..6f2fb9d4a2
--- /dev/null
+++ b/tests/src/GC/Coverage/smalloom.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="smalloom.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/BackgroundGC/app.config b/tests/src/GC/Features/BackgroundGC/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Features/BackgroundGC/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Features/BackgroundGC/concurrentspin2.cs b/tests/src/GC/Features/BackgroundGC/concurrentspin2.cs
new file mode 100644
index 0000000000..23edb8bb34
--- /dev/null
+++ b/tests/src/GC/Features/BackgroundGC/concurrentspin2.cs
@@ -0,0 +1,184 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Diagnostics;
+using System.Threading;
+
+class PriorityTest
+{
+ private byte[][] old;
+ private byte[][] med;
+ private Random rand;
+
+ private int oldDataSize;
+ private int medDataSize;
+ private int iterCount;
+ private int meanAllocSize;
+ private int medTime;
+ private int youngTime;
+
+
+ public PriorityTest(int oldDataSize, int medDataSize,
+ int iterCount, int meanAllocSize,
+ int medTime, int youngTime)
+ {
+ rand = new Random(314159);
+ this.oldDataSize = oldDataSize;
+ this.medDataSize = medDataSize;
+ this.iterCount = iterCount;
+ this.meanAllocSize = meanAllocSize;
+ this.medTime = medTime;
+ this.youngTime = youngTime;
+ }
+
+ // creates initial arrays
+ void AllocTest(int oldDataSize, int medDataSize, int meanAllocSize)
+ {
+ old = new byte[oldDataSize][];
+ med = new byte[medDataSize][];
+
+ for (int i = 0; i < old.Length; i++)
+ {
+ old[i] = new byte[meanAllocSize];
+ }
+
+ for (int i = 0; i < med.Length; i++)
+ {
+ med[i] = new byte[meanAllocSize];
+ }
+ }
+
+ // churns data in the heap by replacing byte arrays with new ones of random length
+ // this should induce concurrent GCs
+ void SteadyState(int oldDataSize, int medDataSize,
+ int iterCount, int meanAllocSize,
+ int medTime, int youngTime)
+ {
+
+ for (int i = 0; i < iterCount; i++)
+ {
+ byte[] newarray = new byte[meanAllocSize];
+
+ if ((i % medTime) == 0)
+ {
+ old[rand.Next(0, old.Length)] = newarray;
+ }
+ if ((i % youngTime) == 0)
+ {
+ med[rand.Next(0, med.Length)] = newarray;
+ }
+ //if (((i % 5000) == 0) && (Thread.CurrentThread.Priority != ThreadPriority.Lowest))
+ //{
+ // Thread.Sleep(200);
+ //}
+ }
+ }
+
+ // method that runs the test
+ public void RunTest()
+ {
+ for (int iteration = 0; iteration < iterCount; iteration++)
+ {
+ AllocTest(oldDataSize, medDataSize, meanAllocSize);
+
+ SteadyState(oldDataSize, medDataSize,
+ iterCount, meanAllocSize,
+ medTime, youngTime);
+
+ if (((iteration + 1) % 20) == 0)
+ Console.WriteLine("Thread: {1} Finished iteration {0}", iteration, System.Threading.Thread.CurrentThread.Name);
+ }
+
+ }
+
+}
+
+
+class ConcurrentRepro
+{
+
+ public static void Usage()
+ {
+ Console.WriteLine("Usage:");
+ Console.WriteLine("\t<num iterations> <num threads>");
+ }
+
+ public static int[] ParseArgs(string[] args)
+ {
+ int[] parameters = new int[2];
+
+ // set defaults
+ parameters[0] = 100;
+ parameters[1] = 4;
+
+ if (args.Length == 0)
+ {
+ //use defaults
+ Console.WriteLine("Using defaults: 100 iterations, 4 threads");
+ return parameters;
+ }
+ if (args.Length == parameters.Length)
+ {
+ for (int i = 0; i < args.Length; i++)
+ {
+ int j = 0;
+ if (!int.TryParse(args[i], out j))
+ {
+ Usage();
+ return null;
+ }
+ parameters[i] = j;
+ }
+
+ return parameters;
+ }
+
+ // incorrect number of arguments
+ Usage();
+ return null;
+ }
+
+
+ public static int Main(string[] args)
+ {
+
+ // parse arguments
+ int[] parameters = ParseArgs(args);
+ if (parameters == null)
+ {
+ return 0;
+ }
+
+ // set process affinity to 1 to repro bug easier
+ //Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)1;
+
+
+ PriorityTest priorityTest = new PriorityTest(1000000, 5000, parameters[0], 17, 30, 3);
+ ThreadStart startDelegate = new ThreadStart(priorityTest.RunTest);
+
+ // create threads
+ Thread[] threads = new Thread[parameters[1]];
+ for (int i = 0; i < threads.Length; i++)
+ {
+ threads[i] = new Thread(startDelegate);
+ threads[i].Name = String.Format("Thread{0}", i);
+ //if (i % 2 == 0)
+ //{
+ // threads[i].Priority = ThreadPriority.Lowest;
+ //}
+ threads[i].Start();
+ }
+
+ // wait for threads to complete
+ for (int i = 0; i < threads.Length; i++)
+ {
+ threads[i].Join();
+ }
+
+ return 100;
+ }
+}
+
+
diff --git a/tests/src/GC/Features/BackgroundGC/concurrentspin2.csproj b/tests/src/GC/Features/BackgroundGC/concurrentspin2.csproj
new file mode 100644
index 0000000000..5e585cf88d
--- /dev/null
+++ b/tests/src/GC/Features/BackgroundGC/concurrentspin2.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="ConcurrentSpin2.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/BackgroundGC/foregroundgc.cs b/tests/src/GC/Features/BackgroundGC/foregroundgc.cs
new file mode 100644
index 0000000000..cd57f1c96f
--- /dev/null
+++ b/tests/src/GC/Features/BackgroundGC/foregroundgc.cs
@@ -0,0 +1,93 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+
+namespace ForegroundGC
+{
+ class ForegroundGC
+ {
+ static bool done = false;
+ static long maxAlloc = 1024 * 1024 * 1024; //1GB max size
+ static int size = 30;
+ static int Main(string[] args)
+ {
+ if (args.Length > 0)
+ {
+ if ((args[0].CompareTo("-?") == 0) || (args[0].CompareTo("/?") == 0))
+ {
+ Console.WriteLine("Usage: ForegroundGC.exe [max allocation in MB] [object size in bytes]");
+ return 0;
+ }
+ else
+ {
+ long maxAllocMB = Int32.Parse(args[0]);
+ maxAlloc = maxAllocMB * 1024 * 1024;
+ }
+ }
+ if (args.Length > 1)
+ {
+ size = Int32.Parse(args[1]);
+ }
+ Console.WriteLine("Max allocation = {0} bytes; Objects size = {1}", maxAlloc, size);
+ List<byte[]> List1 = new List<byte[]>();
+ List<byte[]> List2 = new List<byte[]>();
+ long AllocCount = 0; //bytes allocated
+
+ while (AllocCount < maxAlloc)
+ {
+ byte[] b = new byte[size];
+ AllocCount += size;
+ List1.Add(b);
+
+
+ byte[] b2 = new byte[size];
+ AllocCount += size;
+ List2.Add(b2);
+
+ }
+ Thread t = new Thread(AllocateTemp);
+ t.Start();
+ List2.Clear();
+ Console.WriteLine("Finished allocating big array");
+ GC.Collect(2, GCCollectionMode.Optimized, false);
+
+ for (int k = 0; k < 2; k++)
+ {
+ for (int i = List1.Count - 1; i >= 0; i--)
+ {
+ List2.Add(List1[i]);
+ List1.RemoveAt(i);
+ }
+ for (int i = List2.Count - 1; i >= 0; i--)
+ {
+ List1.Add(List2[i]);
+ List2.RemoveAt(i);
+ }
+ }
+
+ done = true;
+ t.Join();
+ Console.WriteLine("List count=" + List1.Count);
+
+ GC.KeepAlive(List1);
+ GC.KeepAlive(List2);
+
+ return 100;
+ }
+
+ static void AllocateTemp()
+ {
+ while (!done)
+ {
+ byte[] b = new byte[30];
+ byte[] b2 = new byte[100];
+ }
+ }
+ }
+}
diff --git a/tests/src/GC/Features/BackgroundGC/foregroundgc.csproj b/tests/src/GC/Features/BackgroundGC/foregroundgc.csproj
new file mode 100644
index 0000000000..5ee010d6b9
--- /dev/null
+++ b/tests/src/GC/Features/BackgroundGC/foregroundgc.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="ForegroundGC.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/Finalizer/finalizeio/app.config b/tests/src/GC/Features/Finalizer/finalizeio/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeio/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Features/Finalizer/finalizeio/finalizeio.cs b/tests/src/GC/Features/Finalizer/finalizeio/finalizeio.cs
new file mode 100644
index 0000000000..9f078604c0
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeio/finalizeio.cs
@@ -0,0 +1,103 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests IO in Finalize()
+
+using System;
+using System.IO;
+
+public class Test {
+
+ public class Dummy {
+
+ public static bool visited;
+
+ ~Dummy() {
+
+ Console.WriteLine("In Finalize() of Dummy");
+
+ visited=true;
+
+ try
+ {
+ FileStream test = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);
+ using (StreamReader read = new StreamReader(test))
+ {
+ // while not at the end of the file
+ while (read.Peek() > -1)
+ Console.WriteLine(read.ReadLine());
+ }
+ }
+ catch(Exception e)
+ {
+ Console.WriteLine("Exception handled: " + e);
+ visited=false;
+ }
+
+ }
+ }
+
+ public class CreateObj{
+ public Dummy obj;
+
+ public CreateObj() {
+ obj = new Dummy();
+ }
+
+ public bool RunTest() {
+
+ obj=null;
+ GC.Collect();
+
+ GC.WaitForPendingFinalizers(); // makes sure Finalize() is called.
+
+ return Dummy.visited;
+
+ }
+ }
+
+ public static int Main() {
+ CreateObj temp = new CreateObj();
+
+ using (StreamWriter writer = File.CreateText("temp.txt"))
+ {
+writer.WriteLine(@"***************** START ************************
+This is a test file for testing IO in Finalizers.
+Line 1
+Line 2
+Line 3
+Line 4
+Line 5
+Line 6
+Line 7
+Line 8
+Line 9
+Line 10
+Line 11
+Line 12
+Line 13
+Line 14
+Line 15
+Line 16
+Line 17
+Line 18
+Line 19
+Line 20
+Line 21
+Line 22
+Line 23
+******************* END *****************************");
+ }
+
+
+ if (temp.RunTest()) {
+ Console.WriteLine("Test for Finalize() & WaitForPendingFinalizers() passed!");
+ return 100;
+ }
+
+ Console.WriteLine("Test for Finalize() & WaitForPendingFinalizers() failed!");
+ return 1;
+
+ }
+}
diff --git a/tests/src/GC/Features/Finalizer/finalizeio/finalizeio.csproj b/tests/src/GC/Features/Finalizer/finalizeio/finalizeio.csproj
new file mode 100644
index 0000000000..696e39d4de
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeio/finalizeio.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="FinalizeIO.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/app.config b/tests/src/GC/Features/Finalizer/finalizeother/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizearray.cs b/tests/src/GC/Features/Finalizer/finalizeother/finalizearray.cs
new file mode 100644
index 0000000000..373bf839d8
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizearray.cs
@@ -0,0 +1,59 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests Finalize() on array of objects
+
+using System;
+
+public class Test {
+
+ public class Dummy {
+ public static int count=0;
+ ~Dummy() {
+ count++;
+ }
+ }
+
+ public class CreateObj {
+ public Dummy[] obj;
+
+ public CreateObj() {
+
+ obj = new Dummy[10000];
+ for(int i=0;i<10000;i++) {
+ obj[i] = new Dummy();
+ }
+ }
+
+ public bool RunTest() {
+ obj=null; // making sure collect is called even with /debug
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ if(Dummy.count == 10000) { // all objects in array finalized!
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+ }
+
+ public static int Main() {
+
+ CreateObj temp = new CreateObj();
+
+ if (temp.RunTest())
+ {
+ Console.WriteLine("Test for Finalize() for array of objects passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for Finalize() for array of objects failed!");
+ return 1;
+ }
+
+ }
+}
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizearray.csproj b/tests/src/GC/Features/Finalizer/finalizeother/finalizearray.csproj
new file mode 100644
index 0000000000..ae688beee8
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizearray.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="FinalizeArray.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizearraysleep.cs b/tests/src/GC/Features/Finalizer/finalizeother/finalizearraysleep.cs
new file mode 100644
index 0000000000..caf2be013b
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizearraysleep.cs
@@ -0,0 +1,59 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests Sleep in Finalizer for array of objects
+
+using System;
+using System.Threading;
+
+public class Test {
+
+ public class Dummy {
+ public static int count=0;
+ ~Dummy() {
+ count++;
+ Thread.Sleep(1000);
+ }
+ }
+
+ public class CreateObj {
+ public Dummy[] obj;
+ public int ExitCode = 0;
+
+ public CreateObj() {
+ obj = new Dummy[10];
+
+ for(int i=0;i<10;i++) {
+ obj[i] = new Dummy();
+ }
+ }
+
+ public void RunTest() {
+
+ obj=null; // making sure collect is called even with /debug
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ if(Dummy.count == 10) { // all objects in array finalized!
+ ExitCode = 100;
+ //Console.WriteLine("Test for Finalize() for array of objects passed!");
+ }
+ else {
+ ExitCode = 1;
+ //Console.WriteLine("Test for Finalize() for array of objects failed!");
+ }
+ }
+ }
+
+ public static int Main() {
+ CreateObj temp = new CreateObj();
+ temp.RunTest();
+
+ if(temp.ExitCode==100)
+ Console.WriteLine("Test for Finalize() for array of objects passed!");
+ else
+ Console.WriteLine("Test for Finalize() for array of objects failed!");
+ return temp.ExitCode;
+ }
+}
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizearraysleep.csproj b/tests/src/GC/Features/Finalizer/finalizeother/finalizearraysleep.csproj
new file mode 100644
index 0000000000..f4c6e5f194
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizearraysleep.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="FinalizeArraySleep.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizedest.cs b/tests/src/GC/Features/Finalizer/finalizeother/finalizedest.cs
new file mode 100644
index 0000000000..5e7cbe2014
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizedest.cs
@@ -0,0 +1,60 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests Finalize() and WaitForPendingFinalizers()
+
+using System;
+
+public class Test
+{
+
+ public class Dummy
+ {
+
+ public static bool visited;
+
+ ~Dummy()
+ {
+ Console.WriteLine("In Finalize() of Dummy");
+ visited=true;
+ }
+ }
+
+ public class CreateObj
+ {
+// disabling unused variable warning
+#pragma warning disable 0414
+ Dummy obj;
+#pragma warning restore 0414
+
+ public CreateObj()
+ {
+ obj = new Dummy();
+ }
+
+ public bool RunTest()
+ {
+ obj=null;
+ GC.Collect();
+
+ GC.WaitForPendingFinalizers(); // makes sure Finalize() is called.
+
+ return Dummy.visited;
+ }
+ }
+
+ public static int Main()
+ {
+ CreateObj temp = new CreateObj();
+
+ if (temp.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+
+ }
+}
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizedest.csproj b/tests/src/GC/Features/Finalizer/finalizeother/finalizedest.csproj
new file mode 100644
index 0000000000..67b6120ec6
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizedest.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="FinalizeDest.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizedirectedgraph.cs b/tests/src/GC/Features/Finalizer/finalizeother/finalizedirectedgraph.cs
new file mode 100644
index 0000000000..8d486f22ec
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizedirectedgraph.cs
@@ -0,0 +1,262 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Build a Directed Graph with 10 nodes
+
+namespace Default {
+
+using System;
+
+public class Graph
+{
+ private Vertex Vfirst = null;
+ private Vertex Vlast = null;
+ private Edge Efirst = null;
+ private Edge Elast = null;
+ private int WeightSum = 0;
+
+ public static int Nodes;
+
+
+ public Graph(int n) { Nodes = n;}
+
+ public void SetWeightSum() {
+ Edge temp = Efirst;
+ WeightSum = 0;
+ while(temp != null) {
+ WeightSum += temp.Weight;
+ temp = temp.Next;
+ }
+ }
+
+ public int GetWeightSum() {
+ return WeightSum;
+ }
+
+ public void BuildEdge(int v1,int v2) {
+ Vertex n1 = null,n2 = null;
+ Vertex temp = Vfirst;
+
+ while(temp != null) {
+ if (v1 == temp.Name)
+ {
+ //found 1st node..
+ n1 = temp;
+ break;
+ }
+ else temp = temp.Next;
+ }
+
+ //check if edge already exists
+ for(int i=0;i<n1.Num_Edges;i++) {
+
+ if (v2 == n1.Adjacent[i].Name) return;
+ }
+
+ temp = Vfirst;
+ while(temp != null) {
+ if (v2 == temp.Name)
+ {
+ //found 2nd node..
+ n2 = temp;
+ break;
+ }
+ else temp = temp.Next;
+ }
+
+ n1.Adjacent[n1.Num_Edges++]=n2;
+
+ Edge temp2 = new Edge(n1,n2);
+ if(Efirst==null) {
+ Efirst = temp2;
+ Elast = temp2;
+ }
+ else {
+ temp2.AddEdge(Elast,temp2);
+ Elast = temp2;
+ }
+ }
+
+ public void BuildGraph() {
+
+ // Build Nodes
+ Console.WriteLine("Building Vertices...");
+ for(int i=0;i< Nodes; i++) {
+ Vertex temp = new Vertex(i);
+ if(Vfirst==null) {
+ Vfirst = temp;
+ Vlast = temp;
+ }
+ else {
+ temp.AddVertex(Vlast,temp);
+ Vlast = temp;
+ }
+ }
+
+ // Build Edges
+ Console.WriteLine("Building Edges...");
+
+ Int32 seed = System.Environment.TickCount;
+ Random rand = new Random(seed);
+
+ for(int i=0;i< Nodes;i++) {
+
+ int j = rand.Next(0,Nodes);
+ for(int k=0;k<j;k++) {
+ int v2;
+ while((v2 = rand.Next(0,Nodes))==i); //select a random node, also avoid self-loops
+ BuildEdge(i,v2); //build edge betn node i and v2
+
+
+ }
+ }
+ }
+
+
+ public void CheckIfReachable() {
+ int[] temp = new int[Nodes];
+ Vertex t1 = Vfirst;
+
+ Console.WriteLine("Making all vertices reachable...");
+ while(t1 != null) {
+ for(int i=0;i<t1.Num_Edges;i++) {
+ if(temp[t1.Adjacent[i].Name] == 0)
+ temp[t1.Adjacent[i].Name]=1;
+ }
+ t1 = t1.Next;
+ }
+
+ for(int v2=0;v2<Nodes;v2++) {
+ if(temp[v2]==0) { //this vertex is not connected
+ Int32 seed = System.Environment.TickCount;
+ Random rand = new Random(seed);
+ int v1;
+ while((v1 = rand.Next(0,Nodes))==v2); //select a random node, also avoid self-loops
+ BuildEdge(v1,v2);
+ temp[v2]=1;
+ }
+ }
+
+ }
+
+
+ public void DeleteVertex() {
+
+ DeleteVertex(Vfirst);
+
+ }
+
+ public void DeleteVertex(Vertex v) {
+ if(v == Vlast) {
+ Vfirst=null;
+ Vlast=null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ return;
+ }
+ Vertex temp = v.Next;
+ v=null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ DeleteVertex(temp);
+ temp=null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ }
+
+}
+
+public class Vertex
+ {
+ public int Name;
+ //public bool Visited = false;
+
+ public Vertex Next;
+ public Vertex[] Adjacent;
+ public Edge[] Edges;
+ public int Num_Edges = 0;
+ public static int count=0;
+
+ public Vertex(int val) {
+ Name = val;
+ Next = null;
+ Adjacent = new Vertex[Graph.Nodes];
+ }
+
+ ~Vertex() {
+ Console.WriteLine("In Finalize of Vertex");
+ count++;
+ if(count==100) {
+ Test.exitCode=100;
+ }
+ }
+
+ public void AddVertex(Vertex x, Vertex y) {
+ x.Next = y;
+ }
+
+ public void DeleteAdjacentEntry(int n) {
+ int temp=Num_Edges;
+ for(int i=0;i< temp;i++) {
+ if(n == Adjacent[i].Name) {
+ for(int j=i;j<Num_Edges;j++)
+ Adjacent[j] = Adjacent[j+1];
+ Num_Edges--;
+ return;
+ }
+ }
+ }
+ }
+
+
+public class Edge
+ {
+ public int Weight;
+ public Vertex v1,v2;
+ public Edge Next;
+
+ public Edge(Vertex n1, Vertex n2) {
+ v1=n1;
+ v2=n2;
+
+ int seed = n1.Name+n2.Name;
+ Random rand = new Random(seed);
+ Weight = rand.Next(0,50);
+ }
+
+ public void AddEdge(Edge x, Edge y) {
+ x.Next = y;
+ }
+
+ }
+
+
+public class Test
+{
+ public static int exitCode;
+ public static int Main()
+ {
+ exitCode=1;
+
+ Console.WriteLine("Test should pass with ExitCode 100");
+ Console.WriteLine("Building Graph with 100 vertices...");
+ Graph MyGraph = new Graph(100); // graph with 10 nodes
+
+ MyGraph.BuildGraph();
+ MyGraph.CheckIfReachable();
+
+ Console.WriteLine("Deleting all vertices...");
+
+ MyGraph.DeleteVertex();
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ Console.WriteLine("Done...");
+
+ return exitCode;
+ }
+}
+}
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizedirectedgraph.csproj b/tests/src/GC/Features/Finalizer/finalizeother/finalizedirectedgraph.csproj
new file mode 100644
index 0000000000..eb454c8a82
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizedirectedgraph.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="FinalizeDirectedGraph.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizeexcep.cs b/tests/src/GC/Features/Finalizer/finalizeother/finalizeexcep.cs
new file mode 100644
index 0000000000..c08cf6dec7
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizeexcep.cs
@@ -0,0 +1,72 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests Exception handling in Finalize()
+
+using System;
+
+public class Test {
+
+ public class List {
+ public int val;
+ public List next;
+ }
+ public class Dummy {
+
+ public static bool visited;
+
+ ~Dummy() {
+ List lst = new List();
+ Console.WriteLine("In Finalize() of Dummy");
+ try {
+ Console.WriteLine(lst.next.val); // should throw nullreference exception
+ } catch(NullReferenceException) {
+ Console.WriteLine("Caught NullReferenceException in Finalize()");
+ visited=true;
+ }
+
+
+ }
+ }
+
+ public class CreateObj {
+ public Dummy obj;
+
+ public CreateObj() {
+ obj = new Dummy();
+ }
+
+ public bool RunTest() {
+ obj=null;
+ GC.Collect();
+
+ GC.WaitForPendingFinalizers(); // makes sure Finalize() is called.
+
+ if(Dummy.visited == true) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+ }
+
+ public static int Main() {
+
+ CreateObj temp= new CreateObj();
+
+ if (temp.RunTest())
+ {
+ Console.WriteLine("Test for Exception handling in Finalize() passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for Exception handling in Finalize() failed!");
+ return 1;
+ }
+
+
+ }
+}
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizeexcep.csproj b/tests/src/GC/Features/Finalizer/finalizeother/finalizeexcep.csproj
new file mode 100644
index 0000000000..048f95baa5
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizeexcep.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="FinalizeExcep.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizeinherit.cs b/tests/src/GC/Features/Finalizer/finalizeother/finalizeinherit.cs
new file mode 100644
index 0000000000..cfce1f6d8f
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizeinherit.cs
@@ -0,0 +1,97 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests Finalize() with Inheritance
+
+using System;
+
+namespace One
+{
+ abstract class A
+ {
+
+ }
+
+ class B: A
+ {
+ ~B()
+ {
+ Console.WriteLine("In Finalize of B");
+ }
+ }
+
+ class C: B
+ {
+ public static int count=0;
+ ~C()
+ {
+ Console.WriteLine("In Finalize of C");
+ count++;
+ }
+ }
+}
+
+namespace Two
+{
+ using One;
+ class D: C
+ {
+ }
+}
+
+namespace Three {
+ using One;
+ using Two;
+
+ class CreateObj
+ {
+
+// disabling unused variable warning
+#pragma warning disable 0414
+ B b;
+ D d;
+#pragma warning restore 0414
+ C c;
+
+ public CreateObj()
+ {
+ b = new B();
+ c = new C();
+ d = new D();
+ }
+
+ public bool RunTest()
+ {
+ A a = c;
+
+ d=null;
+ b=null;
+ a=null;
+ c=null;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ return (C.count == 2);
+ }
+ }
+
+ class Test
+ {
+ static int Main()
+ {
+ CreateObj temp = new CreateObj();
+
+ if (temp.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+
+ }
+ }
+
+}
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizeinherit.csproj b/tests/src/GC/Features/Finalizer/finalizeother/finalizeinherit.csproj
new file mode 100644
index 0000000000..09810c42fd
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizeinherit.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="FinalizeInherit.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizenested.cs b/tests/src/GC/Features/Finalizer/finalizeother/finalizenested.cs
new file mode 100644
index 0000000000..2eb6719b04
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizenested.cs
@@ -0,0 +1,126 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests Nested Finalize()
+
+using System;
+using System.Threading;
+
+public class Test {
+
+ public class D
+ {
+ ~D()
+ {
+ Console.WriteLine("In Finalize() of D");
+ Thread.Sleep(1000);
+ }
+ }
+
+ public class C
+ {
+ public D d;
+
+ public C()
+ {
+ d = new D();
+ }
+
+ ~C()
+ {
+ Console.WriteLine("In Finalize() of C");
+ d=null;
+ Thread.Sleep(1000);
+ }
+ }
+
+ public class B
+ {
+ public C c;
+
+ public B()
+ {
+ c = new C();
+ }
+
+ ~B()
+ {
+ Console.WriteLine("In Finalize() of B");
+ c=null;
+ Thread.Sleep(1000);
+ }
+ }
+
+ public class A
+ {
+ public B b;
+
+ public A()
+ {
+ b = new B();
+ }
+
+ ~A()
+ {
+ Console.WriteLine("In Finalize() of A");
+ b=null;
+ Thread.Sleep(1000);
+ }
+ }
+
+ public class Dummy {
+
+ public A a;
+ public static bool visited;
+
+ public Dummy()
+ {
+ a = new A();
+ }
+
+ ~Dummy()
+ {
+ Console.WriteLine("In Finalize() of Dummy");
+ a=null;
+ visited=true;
+ }
+ }
+
+ public class CreateObj
+ {
+// disabling unused variable warning
+#pragma warning disable 0414
+ Dummy obj;
+#pragma warning restore 0414
+
+ public CreateObj()
+ {
+ obj=new Dummy();
+ }
+
+ public bool RunTest()
+ {
+ obj=null;
+ GC.Collect();
+
+ GC.WaitForPendingFinalizers(); // makes sure Finalize() is called.
+
+ return Dummy.visited;
+ }
+ }
+
+ public static int Main() {
+
+ CreateObj temp = new CreateObj();
+
+ if (temp.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+
+ }
+}
diff --git a/tests/src/GC/Features/Finalizer/finalizeother/finalizenested.csproj b/tests/src/GC/Features/Finalizer/finalizeother/finalizenested.csproj
new file mode 100644
index 0000000000..2b2783054a
--- /dev/null
+++ b/tests/src/GC/Features/Finalizer/finalizeother/finalizenested.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="FinalizeNested.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/HeapExpansion/Finalizer.csproj b/tests/src/GC/Features/HeapExpansion/Finalizer.csproj
index 62c661f3ce..57e841f4d8 100644
--- a/tests/src/GC/Features/HeapExpansion/Finalizer.csproj
+++ b/tests/src/GC/Features/HeapExpansion/Finalizer.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Features/HeapExpansion/GCUtil_HeapExpansion.csproj b/tests/src/GC/Features/HeapExpansion/GCUtil_HeapExpansion.csproj
index 34a16ebd72..c37c71b91e 100644
--- a/tests/src/GC/Features/HeapExpansion/GCUtil_HeapExpansion.csproj
+++ b/tests/src/GC/Features/HeapExpansion/GCUtil_HeapExpansion.csproj
@@ -32,8 +32,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Features/HeapExpansion/Handles.csproj b/tests/src/GC/Features/HeapExpansion/Handles.csproj
index 0cf3a43bb4..f0e5b3e17a 100644
--- a/tests/src/GC/Features/HeapExpansion/Handles.csproj
+++ b/tests/src/GC/Features/HeapExpansion/Handles.csproj
@@ -30,8 +30,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Features/HeapExpansion/bestfit-finalize.cs b/tests/src/GC/Features/HeapExpansion/bestfit-finalize.cs
new file mode 100644
index 0000000000..0e511a33be
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/bestfit-finalize.cs
@@ -0,0 +1,197 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//This is modeled after a server executing requests
+//which pin some of their newly allocated objects.
+using System;
+using System.Threading;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Fragment
+{
+ [SecuritySafeCritical]
+ public class Request
+ {
+ Object[] survivors;
+ GCHandle pin;
+
+ [SecuritySafeCritical]
+ public Request()
+ {
+ survivors = new Object[1 + (int)(Test.AllocationVolume*Test.SurvivalRate)/100];
+ int i = 0;
+ int volume = 0;
+
+ //allocate half of the request size.
+ while (volume < Test.AllocationVolume/2)
+ {
+ volume += AllocHalfVolume(++i, Test.SurvivalRate);
+ }
+
+ //allocate one pinned buffer
+ pin = GCHandle.Alloc(new byte[100], GCHandleType.Pinned);
+
+ //allocate the rest of the request
+ while (volume < Test.AllocationVolume)
+ {
+ volume += AllocHalfVolume(++i, Test.SurvivalRate);
+ }
+
+ }
+
+ // unpins and releases the pinned buffer
+ [SecuritySafeCritical]
+ ~Request()
+ {
+ pin.Free();
+ }
+
+ [SecuritySafeCritical]
+ private int AllocHalfVolume(int index, float survFraction)
+ {
+ int allocSurv = Test.Rand.Next(100, 2000 + 2*index);
+ int alloc = (int)(allocSurv / survFraction) - allocSurv;
+
+ // create garbage
+ int garbage=0;
+ while (garbage < alloc)
+ {
+ int size = Test.Rand.Next(10, 200+2*garbage);
+ Object x = new byte[size];
+ garbage+=size;
+ }
+ survivors[index] = new byte[allocSurv];
+ return allocSurv + alloc;
+ }
+
+ }
+
+ public class Test
+ {
+
+ public static Random Rand;
+ public static int NumRequests = 0;
+ public static int AllocationVolume = 0;
+ public static float SurvivalRate = 0.6f;
+
+ public void Go()
+ {
+ int steadyStateFactor = 5;
+ Request[] requests = new Request[NumRequests];
+ int instRequests = 0;
+ int totalReqs = 0;
+ int nreqsToSteady = 0;
+ bool done = false;
+
+ while (!done)
+ {
+ totalReqs++;
+ int i = Rand.Next(0, NumRequests);
+ if (requests[i] != null)
+ {
+ requests[i] = null;
+ }
+ else
+ {
+ instRequests++;
+ }
+ requests[i] = new Request();
+
+ if (instRequests == NumRequests)
+ {
+ if (nreqsToSteady == 0)
+ {
+ nreqsToSteady = totalReqs;
+ Console.WriteLine ("Took {0} iterations to reach steady state", nreqsToSteady);
+ }
+ else if (totalReqs == steadyStateFactor*nreqsToSteady)
+ {
+ done = true;
+ }
+ }
+ }
+
+ for (int i = 0; i < NumRequests; i++)
+ {
+ requests[i] = null;
+ }
+
+ }
+
+
+ public static void Usage()
+ {
+ Console.WriteLine("Usage:");
+ Console.WriteLine("Fragment <num iterations> <num requests> <allocation volume> [random seed]");
+ }
+
+
+ static public int Main (String[] args)
+ {
+ int numIterations = 0;
+ int randomSeed = 0;
+
+ switch (args.Length)
+ {
+ case 0:
+ // use defaults
+ numIterations = 1;
+ NumRequests = 1200;
+ AllocationVolume = 100000;
+ randomSeed = (int)DateTime.Now.Ticks;
+ Console.WriteLine("Using defaults: {0} {1} {2}", numIterations, NumRequests, AllocationVolume);
+
+ break;
+ case 3:
+ case 4:
+ if ( (!Int32.TryParse(args[0], out numIterations)) ||
+ (!Int32.TryParse(args[1], out NumRequests)) ||
+ (!Int32.TryParse(args[2], out AllocationVolume)) )
+ {
+ goto default;
+ }
+
+ if (args.Length==4)
+ {
+ if (!Int32.TryParse(args[3], out randomSeed))
+ {
+ goto default;
+ }
+ }
+ else
+ {
+ randomSeed = (int)DateTime.Now.Ticks;
+ }
+
+ break;
+ default:
+ Usage();
+ return 1;
+ }
+
+ Console.WriteLine("Using random seed: {0}", randomSeed );
+ Rand = new Random(randomSeed);
+
+ try
+ {
+ for (int j=0; j<numIterations; j++)
+ {
+ Test t = new Test();
+ t.Go();
+ }
+ }
+ catch (OutOfMemoryException)
+ {
+ Console.WriteLine("OOM");
+ Console.WriteLine(GC.GetTotalMemory(false));
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ }
+}
diff --git a/tests/src/GC/Features/HeapExpansion/bestfit-finalize.csproj b/tests/src/GC/Features/HeapExpansion/bestfit-finalize.csproj
new file mode 100644
index 0000000000..32fe397b7b
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/bestfit-finalize.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="bestfit-finalize.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/HeapExpansion/bestfit-threaded.cs b/tests/src/GC/Features/HeapExpansion/bestfit-threaded.cs
new file mode 100644
index 0000000000..0b02803190
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/bestfit-threaded.cs
@@ -0,0 +1,195 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//This is modeled after a server executing requests
+//which pin some of their newly allocated objects.
+using System;
+using System.Threading;
+using System.Runtime.InteropServices;
+using System.Security;
+
+public class one_pass
+{
+ public Random r = new Random(request.RandomSeed);
+
+[SecuritySafeCritical]
+public one_pass ()
+ {
+
+ int n_requests = 1200;
+ int allocation_volume = 100000;
+ float survival_rate = 0.6f;
+ int steady_state_factor = 5;
+ request[] requests = new request[n_requests];
+ int inst_requests = 0;
+ int total_reqs = 0;
+ int nreqs_to_steady = 0;
+ while (true)
+ {
+ total_reqs++;
+ int i = r.Next (0, n_requests);
+ if (requests [i] != null)
+ {
+ requests [i].retire();
+ }
+ else
+ {
+ inst_requests++;
+ }
+ requests [i] = new request (allocation_volume, survival_rate);
+
+ if (inst_requests == n_requests)
+ {
+ if (nreqs_to_steady == 0)
+ {
+ nreqs_to_steady = total_reqs;
+ Console.WriteLine ("took {0} iteration to reach steady state",
+ nreqs_to_steady);
+ } else if (total_reqs == steady_state_factor*nreqs_to_steady)
+ {
+ break;
+ }
+ }
+ }
+
+ for (int i = 0; i < n_requests; i++)
+ {
+ requests[i].retire();
+ }
+
+ }
+}
+
+
+public class request
+{
+ Object[] survivors;
+ GCHandle pin;
+ public Random r = new Random(request.RandomSeed);
+
+ [SecuritySafeCritical]
+ public request (int alloc_volume, float surv_fraction)
+ {
+ survivors = new Object [1 + (int)(alloc_volume*surv_fraction)/100];
+ int i = 0;
+ int volume = 0;
+ //allocate half of the request size.
+ while (volume < alloc_volume/2)
+ {
+ int alloc_surv = r.Next (100, 2000 + 2*i);
+ //Console.WriteLine ("alloc_surv {0}", alloc_surv);
+ int alloc = (int)(alloc_surv / surv_fraction) - alloc_surv;
+ //Console.WriteLine ("alloc {0}", alloc);
+ int j = 0;
+ while (j < alloc)
+ {
+ int s = r.Next (10, 200+2*j);
+
+ Object x = new byte [s];
+ j+=s;
+ }
+ survivors [i] = new byte [alloc_surv];
+ i++;
+ volume += alloc_surv + alloc;
+ }
+ //allocate one pinned buffer
+ pin = GCHandle.Alloc (new byte [100], GCHandleType.Pinned);
+ //allocate the rest of the request
+ while (volume < alloc_volume)
+ {
+ int alloc_surv = r.Next (100, 2000 + 2*i);
+ //Console.WriteLine ("alloc_surv {0}", alloc_surv);
+ int alloc = (int)(alloc_surv / surv_fraction) - alloc_surv;
+ //Console.WriteLine ("alloc {0}", alloc);
+
+ survivors [i] = new byte [alloc_surv];
+
+ int j = 0;
+ while (j < alloc)
+ {
+ int s = r.Next (10, 200+2*j);
+
+ Object x = new byte [s];
+ j+=s;
+ }
+ i++;
+ volume += alloc_surv + alloc;
+ }
+
+ }
+
+ [SecuritySafeCritical]
+ public void retire()
+ {
+ pin.Free();
+ }
+
+ public static void Usage()
+ {
+ Console.WriteLine("Usage:");
+ Console.WriteLine("Fragment <num threads> [random seed]");
+ }
+
+ static public int RandomSeed;
+
+ static public int Main (String[] args)
+ {
+
+ int numThreads = 0;
+
+
+ switch (args.Length)
+ {
+ case 0:
+ // use defaults
+ numThreads = 4;
+ RandomSeed = (int)DateTime.Now.Ticks;
+ Console.WriteLine("Using defaults: {0}", numThreads);
+ break;
+ case 1:
+ case 2:
+ if (!Int32.TryParse(args[0], out numThreads))
+ {
+ goto default;
+ }
+ if (args.Length==2)
+ {
+ if (!Int32.TryParse(args[1], out RandomSeed))
+ {
+ goto default;
+ }
+ }
+ else
+ {
+ RandomSeed = (int)DateTime.Now.Ticks;
+ }
+ break;
+ default:
+ Usage();
+ return 1;
+ }
+
+ Console.WriteLine("Using random seed: {0}", RandomSeed );
+
+ Console.WriteLine("Starting Threads...");
+/* Thread[] threads = new Thread[numThreads];
+ for (int i=0; i<threads.Length; i++)
+ {
+ threads[i] = new Thread(new ThreadStart(delegate{ one_pass r = new one_pass(); }));
+ threads[i].Start();
+ }
+
+ Console.WriteLine("Joining Threads...");
+ for (int i=0; i<threads.Length; i++)
+ {
+ threads[i].Join();
+ }
+*/
+new one_pass();
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+}
+
+
diff --git a/tests/src/GC/Features/HeapExpansion/bestfit-threaded.csproj b/tests/src/GC/Features/HeapExpansion/bestfit-threaded.csproj
new file mode 100644
index 0000000000..b813b7eabc
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/bestfit-threaded.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="bestfit-threaded.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/HeapExpansion/bestfit.cs b/tests/src/GC/Features/HeapExpansion/bestfit.cs
new file mode 100644
index 0000000000..4df7a0fa5f
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/bestfit.cs
@@ -0,0 +1,196 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//This is modeled after a server executing requests
+//which pin some of their newly allocated objects.
+using System;
+using System.Threading;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace Fragment
+{
+ public class Request
+ {
+ Object[] survivors;
+ GCHandle pin;
+
+ [SecuritySafeCritical]
+ public Request()
+ {
+ survivors = new Object[1 + (int)(Test.AllocationVolume*Test.SurvivalRate)/100];
+ int i = 0;
+ int volume = 0;
+
+ //allocate half of the request size.
+ while (volume < Test.AllocationVolume/2)
+ {
+ volume += AllocHalfVolume(++i, Test.SurvivalRate);
+ }
+
+ //allocate one pinned buffer
+ pin = GCHandle.Alloc(new byte[100], GCHandleType.Pinned);
+
+ //allocate the rest of the request
+ while (volume < Test.AllocationVolume)
+ {
+ volume += AllocHalfVolume(++i, Test.SurvivalRate);
+ }
+
+ }
+
+ // unpins and releases the pinned buffer
+ [SecuritySafeCritical]
+ public void Retire()
+ {
+ pin.Free();
+ }
+
+ [SecuritySafeCritical]
+ private int AllocHalfVolume(int index, float survFraction)
+ {
+ int allocSurv = Test.Rand.Next(100, 2000 + 2*index);
+ int alloc = (int)(allocSurv / survFraction) - allocSurv;
+
+ // create garbage
+ int garbage=0;
+ while (garbage < alloc)
+ {
+ int size = Test.Rand.Next(10, 200+2*garbage);
+ Object x = new byte[size];
+ garbage+=size;
+ }
+ survivors[index] = new byte[allocSurv];
+ return allocSurv + alloc;
+ }
+
+ }
+
+ public class Test
+ {
+
+ public static Random Rand;
+ public static int NumRequests = 0;
+ public static int AllocationVolume = 0;
+ public static float SurvivalRate = 0.6f;
+
+ public void Go()
+ {
+ int steadyStateFactor = 5;
+ Request[] requests = new Request[NumRequests];
+ int instRequests = 0;
+ int totalReqs = 0;
+ int nreqsToSteady = 0;
+ bool done = false;
+
+ while (!done)
+ {
+ totalReqs++;
+ int i = Rand.Next(0, NumRequests);
+ if (requests[i] != null)
+ {
+ requests[i].Retire();
+ }
+ else
+ {
+ instRequests++;
+ }
+ requests[i] = new Request();
+
+ if (instRequests == NumRequests)
+ {
+ if (nreqsToSteady == 0)
+ {
+ nreqsToSteady = totalReqs;
+ Console.WriteLine ("Took {0} iterations to reach steady state", nreqsToSteady);
+ }
+ else if (totalReqs == steadyStateFactor*nreqsToSteady)
+ {
+ done = true;
+ }
+ }
+ }
+
+ for (int i = 0; i < NumRequests; i++)
+ {
+ requests[i].Retire();
+ }
+
+ }
+
+
+ public static void Usage()
+ {
+ Console.WriteLine("Usage:");
+ Console.WriteLine("Fragment <num iterations> <num requests> <allocation volume> [random seed]");
+ }
+
+
+ static public int Main (String[] args)
+ {
+ int numIterations = 0;
+ int randomSeed = 0;
+
+ switch (args.Length)
+ {
+ case 0:
+ // use defaults
+ numIterations = 1;
+ NumRequests = 1200;
+ AllocationVolume = 100000;
+ randomSeed = (int)DateTime.Now.Ticks;
+ Console.WriteLine("Using defaults: {0} {1} {2}", numIterations, NumRequests, AllocationVolume);
+
+ break;
+ case 3:
+ case 4:
+ if ( (!Int32.TryParse(args[0], out numIterations)) ||
+ (!Int32.TryParse(args[1], out NumRequests)) ||
+ (!Int32.TryParse(args[2], out AllocationVolume)) )
+ {
+ goto default;
+ }
+
+ if (args.Length==4)
+ {
+ if (!Int32.TryParse(args[3], out randomSeed))
+ {
+ goto default;
+ }
+ }
+ else
+ {
+ randomSeed = (int)DateTime.Now.Ticks;
+ }
+
+ break;
+ default:
+ Usage();
+ return 1;
+ }
+
+ Console.WriteLine("Using random seed: {0}", randomSeed );
+ Rand = new Random(randomSeed);
+
+ try
+ {
+ for (int j=0; j<numIterations; j++)
+ {
+ Test t = new Test();
+ t.Go();
+ }
+ }
+ catch (OutOfMemoryException)
+ {
+ Console.WriteLine("OOM");
+ Console.WriteLine(GC.GetTotalMemory(false));
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ }
+}
diff --git a/tests/src/GC/Features/HeapExpansion/bestfit.csproj b/tests/src/GC/Features/HeapExpansion/bestfit.csproj
new file mode 100644
index 0000000000..3540e68f55
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/bestfit.csproj
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>1 1000 50000</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="bestfit.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/HeapExpansion/bestfit_1.csproj b/tests/src/GC/Features/HeapExpansion/bestfit_1.csproj
new file mode 100644
index 0000000000..5e2938f6ec
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/bestfit_1.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>1 1000 50000</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <!-- Set to 'Full' if the Debug? column is marked in the spreadsheet. Leave blank otherwise. -->
+ <DebugType>PdbOnly</DebugType>
+ <NoLogo>True</NoLogo>
+ <DefineConstants>$(DefineConstants)</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="bestfit.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>
diff --git a/tests/src/GC/Features/HeapExpansion/expandheap.cs b/tests/src/GC/Features/HeapExpansion/expandheap.cs
new file mode 100644
index 0000000000..dee19ebcea
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/expandheap.cs
@@ -0,0 +1,38 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*
+This test stimulates heap expansion on the finalizer thread
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+public class Test
+{
+
+
+
+ public static int Main()
+ {
+ Console.WriteLine("First Alloc");
+ GCUtil.Alloc(1024*1024*4, 30);
+ GCUtil.FreeNonPins();
+ GC.Collect();
+
+ Console.WriteLine("Second Alloc");
+ GCUtil.Alloc(1024*1024*4, 50);
+ GCUtil.FreeNonPins();
+ GC.Collect();
+ GCUtil.FreePins();
+
+ Console.WriteLine("Test passed");
+ return 100;
+
+ }
+
+
+
+}
diff --git a/tests/src/GC/Features/HeapExpansion/expandheap.csproj b/tests/src/GC/Features/HeapExpansion/expandheap.csproj
new file mode 100644
index 0000000000..9722347261
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/expandheap.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="ExpandHeap.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="GCUtil_HeapExpansion.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/HeapExpansion/plug.cs b/tests/src/GC/Features/HeapExpansion/plug.cs
new file mode 100644
index 0000000000..ac029b4b41
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/plug.cs
@@ -0,0 +1,86 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.Security;
+
+public class Test
+{
+
+ public static void Usage()
+ {
+ Console.WriteLine("USAGE:");
+ Console.WriteLine("plug.exe [numIterations]");
+ }
+
+ [SecuritySafeCritical]
+ public static int Main(string[] args)
+ {
+
+ int size = 10000;
+ int power = 20;
+ int numIterations = 0;
+ GCHandle[] list = new GCHandle[size];
+
+ if (args.Length == 0)
+ {
+ //using defaults
+ numIterations = 100;
+ }
+ else if (args.Length == 1)
+ {
+ if (!Int32.TryParse(args[0], out numIterations))
+ {
+ Usage();
+ return 1;
+ }
+ }
+ else
+ {
+ Usage();
+ return 1;
+ }
+
+ Console.WriteLine("Running {0} iterations", numIterations);
+
+ for (int j=0; j<numIterations; j++)
+ {
+ for (int i=0; i<size; i++)
+ {
+ GCHandleType type = GCHandleType.Normal;
+
+ if (i%5==0)
+ {
+ // pin every 5th handle
+ type = GCHandleType.Pinned;
+ }
+
+ if (!list[i].IsAllocated)
+ {
+ try
+ {
+ byte[] b = new byte[(int)Math.Pow(2,(i%power))];
+ list[i] = (GCHandle.Alloc(b, type));
+ }
+ catch (OutOfMemoryException)
+ {
+ Console.WriteLine("OOM");
+ Console.WriteLine("Heap size: {0}", GC.GetTotalMemory(false));
+ Console.WriteLine("Trying to allocate array of size: {0}", Math.Pow(2,(i%power)));
+ }
+ }
+ else
+ {
+ list[i].Free();
+ }
+ }
+
+ }
+
+ return 100;
+ }
+}
+
diff --git a/tests/src/GC/Features/HeapExpansion/plug.csproj b/tests/src/GC/Features/HeapExpansion/plug.csproj
new file mode 100644
index 0000000000..c31c6a1264
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/plug.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="plug.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/HeapExpansion/pluggaps.cs b/tests/src/GC/Features/HeapExpansion/pluggaps.cs
new file mode 100644
index 0000000000..499453d06f
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/pluggaps.cs
@@ -0,0 +1,51 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*
+This test fragments the heap with ~50 byte holes, then allocates ~50 byte objects to plug them
+*/
+
+using System;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+
+public class Test
+{
+ public static List<GCHandle> gchList = new List<GCHandle>();
+ public static List<byte[]> bList = new List<byte[]>();
+
+ public static int Main()
+ {
+
+ Console.WriteLine("Beginning phase 1");
+ GCUtil.AllocWithGaps();
+
+ Console.WriteLine("phase 1 complete");
+
+
+ // losing all live references to the unpinned byte arrays
+ // this will fragment the heap with ~50 byte holes
+ GCUtil.FreeNonPins();
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ Console.WriteLine("Beginning phase 2");
+
+ bList = new List<byte[]>();
+ for (int i=0; i<1024*1024; i++)
+ {
+ byte[] unpinned = new byte[50];
+ bList.Add(unpinned);
+
+ }
+
+ Console.WriteLine("phase 2 complete");
+
+ GC.KeepAlive(gchList);
+ GC.KeepAlive(bList);
+
+ return 100;
+ }
+} \ No newline at end of file
diff --git a/tests/src/GC/Features/HeapExpansion/pluggaps.csproj b/tests/src/GC/Features/HeapExpansion/pluggaps.csproj
new file mode 100644
index 0000000000..474b393795
--- /dev/null
+++ b/tests/src/GC/Features/HeapExpansion/pluggaps.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="PlugGaps.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="GCUtil_HeapExpansion.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/HeapExpansion/project.json b/tests/src/GC/Features/HeapExpansion/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Features/HeapExpansion/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/app.config b/tests/src/GC/Features/KeepAlive/keepaliveother/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivearray.cs b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivearray.cs
new file mode 100644
index 0000000000..6511db391f
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivearray.cs
@@ -0,0 +1,46 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests KeepAlive() for array of objects
+
+using System;
+
+public class Test {
+
+ public class Dummy {
+
+ public static bool visited;
+ ~Dummy() {
+ //Console.WriteLine("In Finalize() of Dummy");
+ visited=true;
+ }
+ }
+
+ public static int Main() {
+
+ int returnValue = 0;
+ Dummy[] obj = new Dummy[100];
+
+ for(int i=0;i<100;i++) {
+ obj[i]= new Dummy();
+ }
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+
+ if(Dummy.visited == false) { // has not visited the Finalize()
+ returnValue = 100;
+ Console.WriteLine("Test for KeepAlive() passed!");
+ }
+ else {
+ returnValue = 1;
+ Console.WriteLine("Test for KeepAlive() failed!");
+ }
+
+ GC.KeepAlive(obj); // will keep alive 'obj' till this point
+
+ return returnValue;
+ }
+}
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivearray.csproj b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivearray.csproj
new file mode 100644
index 0000000000..a87917a7df
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivearray.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="KeepAliveArray.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivedirectedgraph.cs b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivedirectedgraph.cs
new file mode 100644
index 0000000000..2f3784c635
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivedirectedgraph.cs
@@ -0,0 +1,272 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Build a Directed Graph with 100 nodes
+// Test KeepAlive for huge directed graphs
+
+namespace Default {
+
+using System;
+
+public class Graph
+{
+ private Vertex Vfirst = null;
+ private Vertex Vlast = null;
+ private Edge Efirst = null;
+ private Edge Elast = null;
+ private int WeightSum = 0;
+
+ public static int Nodes;
+ public static bool flag;
+
+ public Graph(int n) { Nodes = n;}
+
+ public void SetWeightSum() {
+ Edge temp = Efirst;
+ WeightSum = 0;
+ while(temp != null) {
+ WeightSum += temp.Weight;
+ temp = temp.Next;
+ }
+ }
+
+ public int GetWeightSum() {
+ return WeightSum;
+ }
+
+ public void BuildEdge(int v1,int v2) {
+ Vertex n1 = null,n2 = null;
+ Vertex temp = Vfirst;
+
+ while(temp != null) {
+ if (v1 == temp.Name)
+ {
+ //found 1st node..
+ n1 = temp;
+ break;
+ }
+ else temp = temp.Next;
+ }
+
+ //check if edge already exists
+ for(int i=0;i<n1.Num_Edges;i++) {
+ if (v2 == n1.Adjacent[i].Name)
+ return;
+ }
+
+ temp = Vfirst;
+ while(temp != null) {
+ if (v2 == temp.Name)
+ {
+ //found 2nd node..
+ n2 = temp;
+ break;
+ }
+ else temp = temp.Next;
+ }
+
+ n1.Adjacent[n1.Num_Edges++]=n2;
+
+ Edge temp2 = new Edge(n1,n2);
+ if(Efirst==null) {
+ Efirst = temp2;
+ Elast = temp2;
+ }
+ else {
+ temp2.AddEdge(Elast,temp2);
+ Elast = temp2;
+ }
+ }
+
+ public void BuildGraph() {
+
+ // Build Nodes
+ Console.WriteLine("Building Vertices...");
+ for(int i=0;i< Nodes; i++) {
+ Vertex temp = new Vertex(i);
+ if(Vfirst==null) {
+ Vfirst = temp;
+ Vlast = temp;
+ }
+ else {
+ temp.AddVertex(Vlast,temp);
+ Vlast = temp;
+ }
+ }
+
+ // Build Edges
+ Console.WriteLine("Building Edges...");
+
+ Int32 seed = Environment.TickCount;
+ Random rand = new Random(seed);
+
+ for(int i=0;i< Nodes;i++) {
+
+ int j = rand.Next(0,Nodes);
+ for(int k=0;k<j;k++) {
+ int v2;
+ while((v2 = rand.Next(0,Nodes))==i); //select a random node, also avoid self-loops
+ BuildEdge(i,v2); //build edge betn node i and v2
+
+
+ }
+ }
+ }
+
+
+ public void CheckIfReachable() {
+ int[] temp = new int[Nodes];
+ Vertex t1 = Vfirst;
+
+ Console.WriteLine("Making all vertices reachable...");
+ while(t1 != null) {
+ for(int i=0;i<t1.Num_Edges;i++) {
+ if(temp[t1.Adjacent[i].Name] == 0)
+ temp[t1.Adjacent[i].Name]=1;
+ }
+ t1 = t1.Next;
+ }
+
+ for(int v2=0;v2<Nodes;v2++) {
+ if(temp[v2]==0) { //this vertex is not connected
+ Int32 seed = Environment.TickCount;
+ Random rand = new Random(seed);
+ int v1;
+ while((v1 = rand.Next(0,Nodes))==v2); //select a random node, also avoid self-loops
+ BuildEdge(v1,v2);
+ temp[v2]=1;
+ }
+ }
+
+ }
+
+
+ public void DeleteVertex() {
+
+ DeleteVertex(Vfirst);
+
+ }
+
+ public void DeleteVertex(Vertex v) {
+ if(v == Vlast) {
+ Vfirst=null;
+ Vlast=null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ return;
+ }
+ Vertex temp = v.Next;
+ v=null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ DeleteVertex(temp);
+ temp=null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ }
+
+ public Vertex ReturnVfirst() {
+ return(Vfirst);
+ }
+
+}
+
+public class Vertex
+ {
+ public int Name;
+ //public bool Visited = false;
+
+ public Vertex Next;
+ public Vertex[] Adjacent;
+ public Edge[] Edges;
+ public int Num_Edges = 0;
+ public static int count=0;
+
+ public Vertex(int val) {
+ Name = val;
+ Next = null;
+ Adjacent = new Vertex[Graph.Nodes];
+ }
+
+ ~Vertex() {
+ //Console.WriteLine("In Finalize of Vertex");
+ count++;
+ if((count==100) && (Graph.flag==false)) {
+ Test.exitCode = 1;
+ }
+ }
+
+ public void AddVertex(Vertex x, Vertex y) {
+ x.Next = y;
+ }
+
+ public void DeleteAdjacentEntry(int n) {
+ int temp=Num_Edges;
+ for(int i=0;i< temp;i++) {
+ if(n == Adjacent[i].Name) {
+ for(int j=i;j<Num_Edges;j++)
+ Adjacent[j] = Adjacent[j+1];
+ Num_Edges--;
+ return;
+ }
+ }
+ }
+ }
+
+
+public class Edge
+ {
+ public int Weight;
+ public Vertex v1,v2;
+ public Edge Next;
+
+ public Edge(Vertex n1, Vertex n2) {
+ v1=n1;
+ v2=n2;
+
+ int seed = n1.Name+n2.Name;
+ Random rand = new Random(seed);
+ Weight = rand.Next(0,50);
+ }
+
+ public void AddEdge(Edge x, Edge y) {
+ x.Next = y;
+ }
+
+ }
+
+
+public class Test
+{
+ public static int exitCode = 0;
+ public static int Main()
+ {
+ Graph.flag=false;
+ exitCode = 100;
+
+ Console.WriteLine("Test should pass with ExitCode 100");
+ Console.WriteLine("Building Graph with 100 vertices...");
+ Graph MyGraph = new Graph(100);
+
+ MyGraph.BuildGraph();
+ MyGraph.CheckIfReachable();
+
+ Console.WriteLine("Deleting all vertices...");
+
+ MyGraph.DeleteVertex();
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ Vertex temp = MyGraph.ReturnVfirst();
+ GC.KeepAlive(temp); // will keep alive the graph till here
+
+ Console.WriteLine("Done...");
+ Graph.flag=true; // to check if finalizers ran at shutdown or earlier
+ return exitCode;
+
+ }
+}
+}
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivedirectedgraph.csproj b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivedirectedgraph.csproj
new file mode 100644
index 0000000000..a6f0c2a8f8
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivedirectedgraph.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="KeepAliveDirectedGraph.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivefinalize.cs b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivefinalize.cs
new file mode 100644
index 0000000000..7c235b0821
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivefinalize.cs
@@ -0,0 +1,54 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests KeepAlive() in Finalize
+
+using System;
+using System.Collections;
+
+public class Test {
+
+ public class Dummy1 {
+ public static bool visited;
+ ~Dummy1() {
+ Console.WriteLine("In Finalize() of Dummy1");
+ Dummy2 temp = new Dummy2();
+ visited=true;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.KeepAlive(temp);
+ }
+ }
+
+ public class Dummy2 {
+ public static bool visited;
+ ~Dummy2() {
+ Console.WriteLine("In Finalize() of Dummy2");
+ visited=true;
+ }
+ }
+
+ public static int Main() {
+
+ int returnValue = 0;
+ Dummy1 obj = new Dummy1();
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ if((Dummy1.visited == false) && (Dummy2.visited == false)) { // has not visited the Finalize()
+ returnValue = 100;
+ Console.WriteLine("Test passed!");
+ }
+ else {
+ returnValue = 1;
+ Console.WriteLine("Test failed!");
+ }
+
+ GC.KeepAlive(obj);
+
+ return returnValue;
+ }
+}
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivefinalize.csproj b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivefinalize.csproj
new file mode 100644
index 0000000000..590b4f676f
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivefinalize.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="KeepAliveFinalize.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivehandle.cs b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivehandle.cs
new file mode 100644
index 0000000000..7f4208f164
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivehandle.cs
@@ -0,0 +1,45 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests KeepAlive() with GCHandles
+
+using System;
+using System.Runtime.InteropServices;
+
+public class Test {
+ public class Dummy {
+
+ public static bool visited;
+ ~Dummy() {
+ //Console.WriteLine("In Finalize() of Dummy");
+ visited=true;
+ }
+ }
+
+ public static int Main() {
+
+ int returnValue = 0;
+ Dummy obj = new Dummy();
+
+ Console.WriteLine("Allocating a Weak handle to object..");
+ GCHandle handle = GCHandle.Alloc(obj,GCHandleType.Weak);
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ if(Dummy.visited == false) { // has not visited the Finalize()
+ returnValue = 100;
+ Console.WriteLine("Test for KeepAlive() passed!");
+ }
+ else {
+ returnValue = 1;
+ Console.WriteLine("Test for KeepAlive() failed!");
+ }
+
+ GC.KeepAlive(obj); // will keep alive 'obj' till this point
+ GC.Collect();
+
+ return returnValue;
+ }
+}
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivehandle.csproj b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivehandle.csproj
new file mode 100644
index 0000000000..3197ab0e5c
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivehandle.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="KeepAliveHandle.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivescope.cs b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivescope.cs
new file mode 100644
index 0000000000..7b041ff25e
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivescope.cs
@@ -0,0 +1,68 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests KeepAlive() scopes
+
+using System;
+
+public class Test {
+
+ public static int returnValue = 0;
+ public class Dummy {
+
+ public static bool visited;
+ ~Dummy() {
+ //Console.WriteLine("In Finalize() of Dummy");
+ visited=true;
+ }
+ }
+
+ public class CreateObj {
+ public Dummy obj;
+ public bool result;
+
+ public CreateObj() {
+ obj = new Dummy();
+ result=false;
+ }
+
+ public void RunTest() {
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+
+ if((Dummy.visited == false)) { // has not visited the Finalize() yet
+ result=true;
+ }
+
+ GC.KeepAlive(obj); // will keep alive 'obj' till this point
+
+ obj=null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ if(result==true && Dummy.visited==true)
+ returnValue = 100;
+ else
+ returnValue = 1;
+ }
+
+ }
+
+ public static int Main() {
+
+ CreateObj temp = new CreateObj();
+ temp.RunTest();
+
+ if (returnValue == 100)
+ Console.WriteLine("Test passed!");
+ else
+ Console.WriteLine("Test failed!");
+
+ return returnValue;
+ }
+}
+
+
+
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivescope.csproj b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivescope.csproj
new file mode 100644
index 0000000000..a1281ab400
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivescope.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="KeepAliveScope.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetry.cs b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetry.cs
new file mode 100644
index 0000000000..2115c29b38
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetry.cs
@@ -0,0 +1,60 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests KeepAlive() in try...catch...finally
+
+using System;
+
+public class Test
+{
+
+ public class Dummy
+ {
+
+ public static bool visited;
+ ~Dummy()
+ {
+ //Console.WriteLine("In Finalize() of Dummy");
+ visited=true;
+ }
+ }
+
+ public static int Main()
+ {
+
+ Dummy[] obj = new Dummy[100];
+
+ try
+ {
+ for(int i=0;i<100;i++)
+ {
+ obj[i]= new Dummy();
+ }
+ throw new IndexOutOfRangeException();
+ }
+ catch(Exception)
+ {
+ Console.WriteLine("Caught exception");
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ }
+ finally
+ {
+ Console.WriteLine("Should come here..still keeping object alive");
+ GC.KeepAlive(obj);
+ }
+
+ if(Dummy.visited == false)
+ { // has not visited the Finalize()
+ Console.WriteLine("Test for KeepAlive() passed!");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test for KeepAlive() failed!");
+ return 1;
+ }
+
+ }
+}
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetry.csproj b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetry.csproj
new file mode 100644
index 0000000000..4681c8bfec
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetry.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="KeepAliveTry.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetypes.cs b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetypes.cs
new file mode 100644
index 0000000000..80189ae7b1
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetypes.cs
@@ -0,0 +1,70 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Tests KeepAlive() with different types of inputs
+
+using System;
+
+public class Test {
+
+ public class Dummy {
+
+ public static bool visited;
+ ~Dummy() {
+ //Console.WriteLine("In Finalize() of Dummy");
+ visited=true;
+ }
+ }
+
+ public struct StrDummy {
+ public int val;
+ public static bool flag;
+
+ public StrDummy(int v) {
+ val=v;
+ flag=true;
+ }
+ }
+
+ public enum Color
+ {
+ Red, Blue, Green
+ }
+
+ public static int Main() {
+
+ int returnValue = 0;
+ Dummy obj = new Dummy();
+ StrDummy strobj = new StrDummy(999);
+ Color enumobj = new Color();
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+
+ if((Dummy.visited == false) && (StrDummy.flag==true)) { // has not visited the Finalize()
+ returnValue = 100;
+ Console.WriteLine("Test passed!");
+ }
+ else {
+ returnValue = 1;
+ Console.WriteLine("Test failed!");
+ }
+
+ GC.KeepAlive(obj); // will keep alive 'obj' till this point
+ GC.KeepAlive(1000000);
+ GC.KeepAlive("long string for testing");
+ GC.KeepAlive(-12345678);
+ GC.KeepAlive(3456.8989);
+ GC.KeepAlive(true);
+ GC.KeepAlive(strobj);
+ GC.KeepAlive(enumobj);
+
+ return returnValue;
+
+ }
+}
+
+
+
diff --git a/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetypes.csproj b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetypes.csproj
new file mode 100644
index 0000000000..aca672b129
--- /dev/null
+++ b/tests/src/GC/Features/KeepAlive/keepaliveother/keepalivetypes.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="KeepAliveTypes.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/LOHCompaction/app.config b/tests/src/GC/Features/LOHCompaction/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Features/LOHCompaction/lohcompact_stress.cs b/tests/src/GC/Features/LOHCompaction/lohcompact_stress.cs
new file mode 100644
index 0000000000..52e15612e3
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/lohcompact_stress.cs
@@ -0,0 +1,189 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Diagnostics;
+using System.Threading;
+using System.Runtime;
+
+//This test creates high fragmentation in the large object heap
+//LOH fragmentation: up to 80-90%
+//No large objects pinned
+//Max GC heap size = 137MB with default param (100 iterations, 4 threads)
+//Code is from test ConcurrentSpin2 and LOH compaction is added
+class PriorityTest
+{
+ private byte[][] old;
+ private byte[][] med;
+ private Random rand;
+
+ private int oldDataSize;
+ private int medDataSize;
+ private int iterCount;
+ private int meanAllocSize;
+ private int medTime;
+ private int youngTime;
+
+
+ public PriorityTest(int oldDataSize, int medDataSize,
+ int iterCount, int meanAllocSize,
+ int medTime, int youngTime)
+ {
+ rand = new Random(314159);
+ this.oldDataSize = oldDataSize;
+ this.medDataSize = medDataSize;
+ this.iterCount = iterCount;
+ this.meanAllocSize = meanAllocSize;
+ this.medTime = medTime;
+ this.youngTime = youngTime;
+ }
+
+ // creates initial arrays
+ void AllocTest(int oldDataSize, int medDataSize, int meanAllocSize)
+ {
+ old = new byte[oldDataSize][];
+ med = new byte[medDataSize][];
+
+ for (int i = 0; i < old.Length; i++)
+ {
+ old[i] = new byte[meanAllocSize];
+ }
+
+ for (int i = 0; i < med.Length; i++)
+ {
+ med[i] = new byte[meanAllocSize];
+ }
+ }
+
+ // churns data in the heap by replacing byte arrays with new ones
+ void SteadyState(int oldDataSize, int medDataSize,
+ int iterCount, int meanAllocSize,
+ int medTime, int youngTime)
+ {
+
+ for (int i = 0; i < iterCount; i++)
+ {
+ byte[] newarray = new byte[meanAllocSize];
+
+ if ((i % medTime) == 0)
+ {
+ old[rand.Next(0, old.Length)] = newarray;
+ }
+ if ((i % youngTime) == 0)
+ {
+ med[rand.Next(0, med.Length)] = newarray;
+ }
+ if ((i % 500) == 0)
+ {
+ Thread.Sleep(10);
+ }
+ if ((i % (1000 * System.Threading.Thread.CurrentThread.ManagedThreadId)) == 0)
+ {
+ GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
+ if ((i % 5 == 0) && (System.Runtime.GCSettings.LatencyMode != System.Runtime.GCLatencyMode.Batch))
+ GC.Collect();
+ }
+ }
+ }
+
+ // method that runs the test
+ public void RunTest()
+ {
+ for (int iteration = 0; iteration < iterCount; iteration++)
+ {
+ AllocTest(oldDataSize, medDataSize, meanAllocSize);
+
+ SteadyState(oldDataSize, medDataSize,
+ iterCount, meanAllocSize,
+ medTime, youngTime);
+
+ if (((iteration + 1) % 20) == 0)
+ Console.WriteLine("Thread: {1} Finished iteration {0}", iteration, System.Threading.Thread.CurrentThread.Name);
+ }
+
+ }
+
+}
+
+
+class ConcurrentRepro
+{
+
+ public static void Usage()
+ {
+ Console.WriteLine("Usage:");
+ Console.WriteLine("\t<num iterations> <num threads>");
+ }
+
+ public static int[] ParseArgs(string[] args)
+ {
+ int[] parameters = new int[2];
+
+ // set defaults
+ parameters[0] = 100;
+ parameters[1] = 4;
+
+ if (args.Length == 0)
+ {
+ //use defaults
+ Console.WriteLine("Using defaults: 100 iterations, 4 threads");
+ return parameters;
+ }
+ if (args.Length == parameters.Length)
+ {
+ for (int i = 0; i < args.Length; i++)
+ {
+ int j = 0;
+ if (!int.TryParse(args[i], out j))
+ {
+ Usage();
+ return null;
+ }
+ parameters[i] = j;
+ }
+
+ return parameters;
+ }
+
+ // incorrect number of arguments
+ Usage();
+ return null;
+ }
+
+
+ public static int Main(string[] args)
+ {
+
+ // parse arguments
+ int[] parameters = ParseArgs(args);
+ if (parameters == null)
+ {
+ return 0;
+ }
+
+
+
+ PriorityTest priorityTest = new PriorityTest(1000000, 5000, parameters[0], 17, 30, 3);
+ ThreadStart startDelegate = new ThreadStart(priorityTest.RunTest);
+
+ // create threads
+ Thread[] threads = new Thread[parameters[1]];
+ for (int i = 0; i < threads.Length; i++)
+ {
+ threads[i] = new Thread(startDelegate);
+ threads[i].Name = String.Format("Thread{0}", i);
+ threads[i].Start();
+ }
+
+ // wait for threads to complete
+ for (int i = 0; i < threads.Length; i++)
+ {
+ threads[i].Join();
+ }
+
+ return 100;
+ }
+}
+
+
diff --git a/tests/src/GC/Features/LOHCompaction/lohcompact_stress.csproj b/tests/src/GC/Features/LOHCompaction/lohcompact_stress.csproj
new file mode 100644
index 0000000000..f3adce1741
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/lohcompact_stress.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LOHCompact_Stress.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/LOHCompaction/lohcompactapi.cs b/tests/src/GC/Features/LOHCompaction/lohcompactapi.cs
new file mode 100644
index 0000000000..fc69b4145d
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/lohcompactapi.cs
@@ -0,0 +1,137 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Runtime;
+using System.Reflection;
+
+
+namespace LOHCompactAPI
+{
+ class Program
+ {
+ static int ListSize = 500;
+ static List<byte[]> shortLivedList = new List<byte[]>(ListSize);
+ static List<byte[]> LongLivedList = new List<byte[]>(ListSize);
+
+ public static int Main(string[] args)
+ {
+ int retVal=0;
+ for (int i = 0; i < 3; i++)
+ {
+ retVal = Runtest(i);
+ Console.WriteLine("Heap size=" + GC.GetTotalMemory(false));
+ if (retVal != 100)
+ break;
+ }
+ if (retVal == 100)
+ Console.WriteLine("Test passed");
+ return retVal;
+ }
+
+ static int Runtest(int count)
+ {
+ //Create fragmentation in the Large Object Heap
+ System.Random rnd = new Random(12345);
+ for (int i = 0; i < ListSize; i++)
+ {
+ shortLivedList.Add(new byte[rnd.Next(85001, 100000)]);
+ LongLivedList.Add(new byte[rnd.Next(85001, 100000)]);
+
+ }
+ shortLivedList.Clear();
+ GC.Collect(); //when using perfview, LOH should be fragmented after this GC
+
+ //Verify the initial compaction mode should be default
+ if (GCSettings.LargeObjectHeapCompactionMode != GCLargeObjectHeapCompactionMode.Default)
+ {
+ Console.WriteLine("Initial GCLargeObjectHeapCompactionMode should be default; instead it is " + GCSettings.LargeObjectHeapCompactionMode);
+ return 1;
+ }
+ //Set the compaction mode to compact the large object heap
+ int initial_collectionCount = GetBlockingGen2Count();
+ GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
+
+ //verify the compaction mode is set correctly
+ if (GCSettings.LargeObjectHeapCompactionMode != GCLargeObjectHeapCompactionMode.CompactOnce)
+ {
+ Console.WriteLine("GCLargeObjectHeapCompactionMode should be CompactOnce; instead it is " + GCSettings.LargeObjectHeapCompactionMode);
+ return 2;
+ }
+
+ //CompactionMode should revert to default after a compaction has happened
+
+ //The following byte array allocation has the purpose to try to trigger a blocking Gen2 collection. LOH should be compacted during the next blocking Gen2 GC.
+ byte[] bArr;
+ int listSize2 = 1000;
+ List<byte[]> newList = new List<byte[]>();
+ List<byte[]> tempList = new List<byte[]>();
+ bool Gen2Happened = false;
+
+ for (int k = 0; !Gen2Happened && (k < listSize2); k++)
+ {
+ newList.Add(new byte[rnd.Next(20, 5000)]);
+ for (int i = 0; i < ListSize; i++)
+ {
+ bArr = new byte[rnd.Next(20, 5000)];
+ tempList.Add(new byte[rnd.Next(20, 5000)]);
+
+ if (GetBlockingGen2Count() > initial_collectionCount)
+ {
+ Gen2Happened = true;
+ Console.WriteLine("Blocking Gen2 collection happened");
+ //when using perfview,LOH fragmentation should be zero after this GC
+ break;
+ }
+
+ }
+
+ if(k>=10)
+ {
+ newList[rnd.Next(0, newList.Count)] = new byte[rnd.Next(20, 5000)];
+ newList[rnd.Next(0, newList.Count)] = new byte[rnd.Next(20, 5000)];
+ }
+ if(k%10==0)
+ tempList.Clear();
+
+
+ }
+ if (GetBlockingGen2Count() == initial_collectionCount) //a blocking Gen2 collection did not happen; trigger one.
+ GC.Collect();
+
+ if (GCSettings.LargeObjectHeapCompactionMode != GCLargeObjectHeapCompactionMode.Default)
+ {
+ Console.WriteLine("GCLargeObjectHeapCompactionMode should revert to default after compaction happened; instead it is " + GCSettings.LargeObjectHeapCompactionMode);
+ return 3;
+ }
+
+ Console.WriteLine("Run " + count + " passed");
+ return 100;
+ }
+
+ //Only count the blocking gen2 GC's. Concurrent GC's should be subtracted from the total GC count.
+ public static int GetBlockingGen2Count()
+ {
+ //Get the number of concurrent collections (can use this method only through reflection):
+ MethodInfo collectionCountmethod = null;
+ Type GCType = Type.GetType("System.GC");
+ foreach(MethodInfo m in GCType.GetMethods(BindingFlags.Static | BindingFlags.NonPublic))
+ {
+ if (m.Name.Equals("_CollectionCount") && m.GetParameters().Length == 2) collectionCountmethod = m;
+ }
+ if (collectionCountmethod == null)
+ {
+ Console.WriteLine("collectionCount method is null");
+ return 0;
+ }
+ object[] parameters = new object[2];
+ parameters[0] = 2;
+ parameters[1] = 1; // special gc count
+ int backgroundCollections = (int)collectionCountmethod.Invoke(null, parameters);
+
+ return (GC.CollectionCount(2) - backgroundCollections);
+ }
+ }
+}
diff --git a/tests/src/GC/Features/LOHCompaction/lohcompactapi.csproj b/tests/src/GC/Features/LOHCompaction/lohcompactapi.csproj
new file mode 100644
index 0000000000..55a29756f8
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/lohcompactapi.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LOHCompactAPI.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/LOHCompaction/lohcompactapi2.cs b/tests/src/GC/Features/LOHCompaction/lohcompactapi2.cs
new file mode 100644
index 0000000000..e25baad12d
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/lohcompactapi2.cs
@@ -0,0 +1,218 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Runtime;
+using System.Reflection;
+using System.Threading;
+
+
+namespace LOHCompactAPI
+{
+ class Program
+ {
+ static int ListSize = 500;
+ static List<byte[]> shortLivedList = new List<byte[]>(ListSize);
+ static List<byte[]> LongLivedList = new List<byte[]>(ListSize);
+ static volatile bool testDone = false;
+
+ //There are several threads that allocate, and the main thread calls the compacting API
+ //Verify that the compaction mode changes to default after a blocking GC happened, and does not change if a blocking GC did not happen.
+ public static int Main(string[] args)
+ {
+ int retVal = 100;
+ int iterations = 10;
+
+ if (args.Length > 0)
+ iterations = Int32.Parse(args[0]);
+ Console.WriteLine("Running {0} iterations", iterations);
+
+ testDone = false;
+
+ Thread AllocatingThread = new Thread(Allocate);
+ AllocatingThread.Start();
+ int numThreads = 100;
+ Thread[] threadArr = new Thread[numThreads];
+ for (int i = 0; i < numThreads; i++)
+ {
+ threadArr[i] = new Thread(AllocateTempObjects);
+ threadArr[i].Start();
+ }
+
+ for (int i = 0; i < iterations; i++)
+ {
+ if (!Test1())
+ {
+ retVal = 1;
+ break;
+ }
+ Thread.Sleep(3);
+ }
+ Console.WriteLine("Test1 passed");
+
+ for (int i = 0; i < iterations; i++)
+ {
+ if (!Test2())
+ {
+ retVal = 1;
+ break;
+ }
+ Thread.Sleep(100);
+ }
+ Console.WriteLine("Test2 passed");
+
+
+ testDone = true;
+ AllocatingThread.Join();
+ for (int i = 0; i < numThreads; i++)
+ {
+ threadArr[i].Join();
+ }
+ return retVal;
+ }
+
+ public static bool Test1()
+ {
+
+
+ Console.WriteLine("Setting GCLargeObjectHeapCompactionMode.CompactOnce");
+ int GCCount = 0;
+ int initialGCCount = GetBlockingGen2Count();
+ GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
+ GCCount = GetBlockingGen2Count();
+ if (initialGCCount != GCCount)
+ {
+ Console.WriteLine("A GC happened while setting CompactOnce. Old count {0}, new Count {1}", initialGCCount, GCCount);
+ //skip this run
+ return true;
+ }
+
+
+ Thread.Sleep(100);
+ int currentGCCount = GetBlockingGen2Count();
+ GCLargeObjectHeapCompactionMode mode = GCSettings.LargeObjectHeapCompactionMode;
+ GCCount = GetBlockingGen2Count();
+ if (currentGCCount != GCCount) //a GC happened in between these calls
+ {
+ Console.WriteLine("A GC happened while getting Compaction Mode. Old count {0}, new Count {1}", currentGCCount, GCCount);
+ //skip this run
+ return true;
+ }
+
+ Console.WriteLine("initial GC count: {0}; currentGCCount: {1}", initialGCCount, currentGCCount);
+ Console.WriteLine(mode);
+ if (currentGCCount == initialGCCount)
+ {
+ if (mode != GCLargeObjectHeapCompactionMode.CompactOnce)
+ {
+ Console.WriteLine("GCLargeObjectHeapCompactionMode should be CompactOnce; instead it is " + mode);
+ return false;
+ }
+ }
+ else
+ {
+ if (mode != GCLargeObjectHeapCompactionMode.Default)
+ {
+ Console.WriteLine("GCLargeObjectHeapCompactionMode should be Default; instead it is " + mode);
+ return false;
+ }
+ }
+ return true;
+
+ }
+
+ public static bool Test2()
+ {
+
+
+ Console.WriteLine("Setting GCLargeObjectHeapCompactionMode.CompactOnce");
+ GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
+ GC.Collect();
+ GCLargeObjectHeapCompactionMode mode = GCSettings.LargeObjectHeapCompactionMode;
+ Console.WriteLine(mode);
+ if (mode != GCLargeObjectHeapCompactionMode.Default)
+ {
+ Console.WriteLine("GCLargeObjectHeapCompactionMode should be CompactOnce; instead it is " + mode);
+ return false;
+ }
+
+ return true;
+ }
+
+ public static void AllocateTempObjects(object threadInfoObj)
+ {
+ int listSize2 = 1000;
+ List<byte[]> tempList = new List<byte[]>();
+ while (!testDone)
+ {
+ byte[] temp = new byte[20];
+ for (int i = 0; i < listSize2; i++)
+ {
+ tempList.Add(new byte[50]);
+ }
+ tempList.Clear();
+ }
+
+ }
+
+ public static void Allocate(object threadInfoObj)
+ {
+ int ListSize = 300;
+ System.Random rnd = new Random(1122);
+
+ int listSize2 = 1000;
+ List<byte[]> newList = new List<byte[]>(500 + 1000);
+
+
+ while (!testDone)
+ {
+ for (int i = 0; i < ListSize; i++)
+ {
+ newList.Add(new byte[85000]);
+ newList.Add(new byte[200]);
+ Thread.Sleep(10);
+ }
+ for (int i = 0; i < listSize2; i++)
+ {
+ newList.Add(new byte[50]);
+ }
+ newList.Clear();
+ }
+ }
+
+
+
+
+ //Only count the blocking gen2 GC's. Concurrent GC's should be subtracted from the total GC count.
+ public static int GetBlockingGen2Count()
+ {
+
+ //Get the number of concurrent collections (can use this method only through reflection):
+ MethodInfo collectionCountmethod = null;
+ Type GCType = Type.GetType("System.GC");
+ foreach(MethodInfo m in GCType.GetMethods(BindingFlags.Static | BindingFlags.NonPublic))
+ {
+ if (m.Name.Equals("_CollectionCount") && m.GetParameters().Length == 2) collectionCountmethod = m;
+ }
+ if (collectionCountmethod == null)
+ {
+ Console.WriteLine("collectionCount method is null");
+ return 0;
+ }
+ if (collectionCountmethod == null)
+ {
+ Console.WriteLine("collectionCount method is null");
+ return 0;
+ }
+ object[] parameters = new object[2];
+ parameters[0] = 2;
+ parameters[1] = 1; // special gc count
+ int backgroundCollections = (int)collectionCountmethod.Invoke(null, parameters);
+ int TotalCollections = GC.CollectionCount(2);
+ Console.WriteLine("Total collections {0}, background {1}", TotalCollections, backgroundCollections);
+ return (TotalCollections - backgroundCollections);
+ }
+ }
+}
diff --git a/tests/src/GC/Features/LOHCompaction/lohcompactapi2.csproj b/tests/src/GC/Features/LOHCompaction/lohcompactapi2.csproj
new file mode 100644
index 0000000000..a3609305cf
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/lohcompactapi2.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LOHCompactAPI2.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/LOHCompaction/lohcompactapi_exceptions.cs b/tests/src/GC/Features/LOHCompaction/lohcompactapi_exceptions.cs
new file mode 100644
index 0000000000..0ba7c297de
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/lohcompactapi_exceptions.cs
@@ -0,0 +1,63 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Runtime;
+
+
+
+namespace LOHCompactAPI
+{
+ class Program
+ {
+
+ public static int Main(string[] args)
+ {
+ for(int i = 0; i <= 5; i++)
+ {
+ Console.WriteLine(i);
+ if ((GCLargeObjectHeapCompactionMode)(i) == GCLargeObjectHeapCompactionMode.Default)
+ {
+ Console.WriteLine("Default");
+ continue;
+ }
+ if ((GCLargeObjectHeapCompactionMode)(i) == GCLargeObjectHeapCompactionMode.CompactOnce)
+ {
+ Console.WriteLine("CompactOnce");
+ continue;
+ }
+
+ bool exc = false;
+ try
+ {
+ GCSettings.LargeObjectHeapCompactionMode = (GCLargeObjectHeapCompactionMode)(i);
+ }
+ catch (System.ArgumentOutOfRangeException e1)
+ {
+ Console.WriteLine("Caught expected exception " + e1);
+ exc = true;
+ }
+ catch (System.Exception e2)
+ {
+ Console.WriteLine("Wrong type of exception " + e2);
+ Console.WriteLine("Expected ArgumentOutOfrangeException");
+ return 1;
+ }
+
+ if (!exc)
+ {
+ Console.WriteLine("Expected ArgumentOutOfrangeException for out of range input for LargeObjectHeapCompactionMode");
+ return 2;
+ }
+ }
+
+ Console.WriteLine("Test passed");
+ return 100;
+ }
+
+
+ }
+}
+
+
diff --git a/tests/src/GC/Features/LOHCompaction/lohcompactapi_exceptions.csproj b/tests/src/GC/Features/LOHCompaction/lohcompactapi_exceptions.csproj
new file mode 100644
index 0000000000..2e4d710bf3
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/lohcompactapi_exceptions.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LOHCompactAPI_Exceptions.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/LOHCompaction/lohcompactscenariorepro.cs b/tests/src/GC/Features/LOHCompaction/lohcompactscenariorepro.cs
new file mode 100644
index 0000000000..23b3c84890
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/lohcompactscenariorepro.cs
@@ -0,0 +1,132 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Runtime;
+using System.Reflection;
+using System.Threading;
+//Repro for bug Bug 656705: Heap corruption when using LOH compaction
+
+
+namespace LOHCompactScenarioRepro
+{
+ public class Program
+ {
+ static int ListSize = 500;
+ static List<byte[]> shortLivedList = new List<byte[]>(ListSize);
+ static List<byte[]> LongLivedList = new List<byte[]>(ListSize);
+ static volatile bool testDone = false;
+
+ //There are several threads that allocate, and the main thread calls the compacting API
+ public static int Main(string[] args)
+ {
+ int minutesTorRun = 10;
+
+ if (args.Length > 0)
+ minutesTorRun = Int32.Parse(args[0]);
+ Console.WriteLine("Running {0} minutes", minutesTorRun);
+
+ testDone = false;
+
+ Thread AllocatingThread = new Thread(Allocate);
+ AllocatingThread.Start();
+ int numThreads = 100;
+ Thread[] threadArr = new Thread[numThreads];
+ for (int i = 0; i < numThreads; i++)
+ {
+ threadArr[i] = new Thread(AllocateTempObjects);
+ threadArr[i].Start();
+ }
+ System.Diagnostics.Stopwatch stw = System.Diagnostics.Stopwatch.StartNew();
+
+ int iter = 0;
+ while (true)
+ {
+ GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
+ GC.Collect();
+
+ for (int i = 0; i < 100; i++)
+ {
+ System.Threading.Thread.Sleep(80);
+ GC.Collect();
+ }
+ iter++;
+ if (stw.ElapsedMilliseconds > minutesTorRun * 60 * 1000)
+ {
+ Console.WriteLine("Time exceeded {0} min", minutesTorRun);
+ Console.WriteLine("Ran {0} iterations", iter);
+ break;
+ }
+ }
+
+
+ testDone = true;
+ AllocatingThread.Join();
+ for (int i = 0; i < numThreads; i++)
+ {
+ threadArr[i].Join();
+ }
+
+ if (iter < 3)
+ {
+ Console.WriteLine("Test needs to run at least a few iterations in order to be useful.");
+ return 5;
+ }
+ return 100;
+ }
+
+
+
+ public static void AllocateTempObjects(object threadInfoObj)
+ {
+ int listSize2 = 1000;
+ List<byte[]> tempList = new List<byte[]>();
+ while (!testDone)
+ {
+ byte[] temp = new byte[20];
+ for (int i = 0; i < listSize2; i++)
+ {
+ if (i % 200 == 0)
+ {
+ tempList.Add(new byte[85000]);
+ }
+ else
+ {
+ tempList.Add(new byte[50]);
+ }
+
+ }
+ tempList.Clear();
+ }
+
+ }
+
+ public static void Allocate(object threadInfoObj)
+ {
+ int ListSize = 300;
+ System.Random rnd = new Random(1122);
+
+ int listSize2 = 1000;
+ List<byte[]> newList = new List<byte[]>(500 + 1000);
+
+
+ while (!testDone)
+ {
+ for (int i = 0; i < ListSize; i++)
+ {
+ newList.Add(new byte[85000]);
+ newList.Add(new byte[200]);
+ Thread.Sleep(10);
+ }
+ for (int i = 0; i < listSize2; i++)
+ {
+ newList.Add(new byte[50]);
+ }
+ newList.Clear();
+ }
+ }
+
+ }
+}
diff --git a/tests/src/GC/Features/LOHCompaction/lohcompactscenariorepro.csproj b/tests/src/GC/Features/LOHCompaction/lohcompactscenariorepro.csproj
new file mode 100644
index 0000000000..e4962bbbce
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/lohcompactscenariorepro.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LOHCompactScenarioRepro.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/LOHCompaction/lohpin.cs b/tests/src/GC/Features/LOHCompaction/lohpin.cs
new file mode 100644
index 0000000000..8a91fb24a0
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/lohpin.cs
@@ -0,0 +1,114 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Runtime.InteropServices;
+using System.Runtime;
+
+namespace LOHPin
+{
+ class LOHPin
+ {
+ //Pin an object on the Large Object Heap and verify it does not move during a LOH compaction
+ //Also verify that most of the large objects not pinned have moved
+
+ /* What the test does:
+ * - create high fragmentation in the LOH
+ * - pin some of the large objects
+ * - compact LOH then check the address of the objects
+ * */
+
+ static int Main(string[] args)
+ {
+ List<GCHandle> GCHandleList = new List<GCHandle>();
+ int ListSize = 300;
+ List<byte[]> shortLivedList = new List<byte[]>(ListSize);
+ List<byte[]> LongLivedList = new List<byte[]>(ListSize-ListSize/10);
+ List<IntPtr> LongLivedAddress = new List<IntPtr>(ListSize-ListSize/10); //addresses of objects in LongLivedList
+ List<byte[]> PinList = new List<byte[]>(ListSize/10);
+ List<IntPtr> PinAddress = new List<IntPtr>(ListSize/10); //addresses of objects in PinList
+ //Create fragmentation in the Large Object Heap
+ System.Random rnd = new Random(12345);
+ for (int i = 0; i < ListSize; i++)
+ {
+ shortLivedList.Add(new byte[rnd.Next(85001, 100000)]);
+
+ byte[] bt = new byte[rnd.Next(85001, 100000)];
+ if (i % 10 == 0) //object pinned
+ {
+ PinList.Add(bt);
+ GCHandle gch = GCHandle.Alloc(bt,GCHandleType.Pinned);
+ GCHandleList.Add(gch);
+ PinAddress.Add(gch.AddrOfPinnedObject());
+
+ }
+ else //object not pinned
+ {
+ LongLivedList.Add(bt);
+ GCHandle gch = GCHandle.Alloc(bt, GCHandleType.Pinned);
+ LongLivedAddress.Add(gch.AddrOfPinnedObject());
+ gch.Free();
+ }
+
+ }
+ shortLivedList.Clear();
+ GC.Collect(); //LOH should be fragmented 40-50% after this GC - can observe this with perfview
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
+ GC.Collect();
+
+
+ //check the addresses of objects; pinned and not pinned
+ Console.WriteLine("Check the pinned list");
+ for (int i = 0; i < PinList.Count; i++)
+ {
+ GCHandle gch = GCHandle.Alloc(PinList[i], GCHandleType.Pinned);
+ IntPtr newAddress = gch.AddrOfPinnedObject();
+ Console.WriteLine("OldAddress={0}, NewAddress={1}", PinAddress[i], newAddress);
+ gch.Free();
+ if (!(PinAddress[i] == newAddress))
+ {
+ Console.WriteLine("OldAddress={0}, NewAddress={1}", PinAddress[i], newAddress);
+ Console.WriteLine("Test failed");
+ return 2;
+ }
+ }
+
+ int moved = 0;
+ Console.WriteLine("Check the non pinned list");
+ for (int i = 0; i < LongLivedList.Count; i++)
+ {
+ GCHandle gch = GCHandle.Alloc(LongLivedList[i], GCHandleType.Pinned);
+ IntPtr newAddress = gch.AddrOfPinnedObject();
+ Console.WriteLine("OldAddress={0}, NewAddress={1}", LongLivedAddress[i], newAddress);
+ gch.Free();
+ if (!(LongLivedAddress[i] == newAddress))
+ {
+ moved++;
+ }
+ }
+ Console.WriteLine(moved + " objects have moved out of " + LongLivedList.Count);
+ if (moved < LongLivedList.Count/2)
+ {
+ Console.WriteLine("Test failed. Too few objects have moved during compaction");
+ return 2;
+ }
+
+ Console.WriteLine("Test passed");
+ return 100;
+
+ }
+
+
+
+ }
+
+
+}
diff --git a/tests/src/GC/Features/LOHCompaction/lohpin.csproj b/tests/src/GC/Features/LOHCompaction/lohpin.csproj
new file mode 100644
index 0000000000..43d99c5b74
--- /dev/null
+++ b/tests/src/GC/Features/LOHCompaction/lohpin.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LOHPin.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/LOHFragmentation/app.config b/tests/src/GC/Features/LOHFragmentation/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Features/LOHFragmentation/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Features/LOHFragmentation/lohfragmentation.cs b/tests/src/GC/Features/LOHFragmentation/lohfragmentation.cs
new file mode 100644
index 0000000000..2c060dc3dc
--- /dev/null
+++ b/tests/src/GC/Features/LOHFragmentation/lohfragmentation.cs
@@ -0,0 +1,143 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+using System.Collections.Generic;
+
+//Repro from http://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/
+
+
+
+
+namespace LOH_test
+{
+
+ class Program
+ {
+ //percent difference between the bytes allocated with small blocks only and with larger blocks
+ //This accounts for difference in fragmentation
+ const int maxDiffPercent = 30;
+
+ // Static variable used to store our 'big' block. This ensures that the block is always up for garbage collection.
+
+ static byte[] bigBlock;
+
+
+ // Allocates 90,000 byte blocks, optionally intersperced with larger blocks
+ // Return how many MB can be allocated until OOM
+ static int Fill(bool allocateBigBlocks)
+ {
+
+ // Number of bytes in a small block
+
+ // 90000 bytes, just above the limit for the LOH
+
+ const int blockSize = 90000;
+
+
+
+ // Number of bytes in a larger block: 16Mb initially
+
+ int largeBlockSize = 1 << 24;
+
+
+
+ // Number of small blocks allocated
+
+ int count = 0;
+
+
+
+ try
+ {
+
+ // We keep the 'small' blocks around
+
+ // (imagine an algorithm that allocates memory in chunks)
+
+ List<byte[]> smallBlocks = new List<byte[]>();
+
+
+
+ for (; ; )
+ {
+
+ // Allocate a temporary larger block if we're set up to do so
+
+ if (allocateBigBlocks)
+ {
+
+ bigBlock = new byte[largeBlockSize];
+
+ // The next 'large' block will be just slightly larger
+
+ largeBlockSize++;
+
+ }
+
+
+
+ // Allocate a small block
+
+ smallBlocks.Add(new byte[blockSize]);
+
+ count++;
+
+ }
+
+ }
+
+ catch (OutOfMemoryException)
+ {
+
+ // Force a GC, which should empty the LOH again
+
+ bigBlock = null;
+
+ GC.Collect();
+
+ }
+
+ int TotalMBAllocated = (int)((double)(count * blockSize) / (double)(1024 * 1024));
+
+ // Display the results for the amount of memory we managed to allocate
+
+ Console.WriteLine("{0}: {1}Mb allocated"
+
+ , (allocateBigBlocks ? "With large blocks" : "Only small blocks")
+ , TotalMBAllocated);
+
+ return TotalMBAllocated;
+
+ }
+
+
+
+ static int Main(string[] args)
+ {
+
+ // Display results for cases both with and without the larger blocks
+
+ int w_LargerBlocks = Fill(true);
+
+ int onlySmallBlocks = Fill(false);
+
+ int FragmentationDiffPercent = (int) (((double)(onlySmallBlocks - w_LargerBlocks) / (double)onlySmallBlocks) * 100);
+ Console.WriteLine("Fragmentation difference percent = {0}%", FragmentationDiffPercent);
+
+
+ if (FragmentationDiffPercent > maxDiffPercent)
+ {
+ Console.WriteLine("Test Failed!");
+ return 1;
+ }
+ Console.WriteLine("Test Passed");
+ return 100;
+
+ }
+
+ }
+
+}
diff --git a/tests/src/GC/Features/LOHFragmentation/lohfragmentation.csproj b/tests/src/GC/Features/LOHFragmentation/lohfragmentation.csproj
new file mode 100644
index 0000000000..c1d02068c8
--- /dev/null
+++ b/tests/src/GC/Features/LOHFragmentation/lohfragmentation.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LOHFragmentation.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/PartialCompaction/app.config b/tests/src/GC/Features/PartialCompaction/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Features/PartialCompaction/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Features/PartialCompaction/eco1.cs b/tests/src/GC/Features/PartialCompaction/eco1.cs
new file mode 100644
index 0000000000..522c2ec785
--- /dev/null
+++ b/tests/src/GC/Features/PartialCompaction/eco1.cs
@@ -0,0 +1,820 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Runtime.InteropServices;
+
+//Test for Partial Compaction
+//Goals: create fragmentation in Gen2
+//Allocation should not be too intense
+//For testing the concurrent phase of partial compaction: update references between objects
+//What the test does:
+// 1.Allocating phase:
+//-Allocate n regions
+//-When objects get in Gen2 release the objects used to create spaces
+//-Create refs from objects in these regions to ephemeral objects
+// 2.Steady state
+//- randomly change references between objects
+//- release some of the existing objects (to create fragmentation in the existing regions)
+// Repeat from 1.
+namespace PartialCompactionTest
+{
+ public class PartialCompactionTest
+ {
+
+ //Define the size buckets:
+ public struct SizeBucket
+ {
+ public int minsize;
+ public int maxsize;
+ //public float percentage; //percentage of objects that fall into this bucket
+ public SizeBucket(int min, int max)
+ {
+ //
+ minsize = min;
+ maxsize = max;
+ }
+
+ }
+
+ //Buckets are defined as following:
+ //Bucket1: 17 bytes to 200 bytes
+ //Bucket2: 200bytes to 1000 bytes
+ //Bucket3: 1000 bytes to 10000 bytes
+ //Bucket4: 10000 bytes to 80000 bytes
+ //The rest is over 85000 bytes (Large Object Heap)
+ private const int SIZEBUCKET_COUNT = 4;
+ private const int BUCKET1_MIN = 50;
+ private const int BUCKET2_MIN = 200;
+ private const int BUCKET3_MIN = 1000;
+ private const int BUCKET4_MIN = 10000;
+ private const int BUCKETS_MAX = 80000;
+ //////
+
+ public const int DEFAULT_ITERATIONS = 100;
+ public static int countIters = DEFAULT_ITERATIONS;
+ public static long timeout = 600; //seconds
+ public static SizeBucket[] sizeBuckets = new SizeBucket[SIZEBUCKET_COUNT];
+ public static int randomSeed;
+
+ public static int pointerSize = 4; //bytes
+ [ThreadStatic]
+ public static Random Rand;
+
+ public static int threadCount = 1;
+ public static bool timeBased = true;
+ public static int maxDepth = 10;
+ public static int maxHeapMB = 100; //max heap in MB
+ public static long maxAllocation; //bytes
+ public static int regionSizeMB = 4; //MB
+ public static double EstimatedHeapSize = 0; //bytes
+ public static double EstimatedObjectCount = 0; //estimate how many objects we have
+ public static double AvgObjectSize = 0; //bytes
+
+ [ThreadStatic]
+ public static List<ObjectWrapper> staticArr = new List<ObjectWrapper>(2500);
+ [ThreadStatic]
+ public static List<Region> regionList = new List<Region>(2500);
+ public static int staticIndex = 0;
+ public static ObjectWrapper staticObject;
+
+
+
+ public static int Main(string[] args)
+ {
+ if (!ParseArgs(args))
+ return 101;
+
+ maxAllocation = maxHeapMB * 1024 * 1024;
+ Rand = new Random(randomSeed);
+ List<ObjectWrapper> Arr = new List<ObjectWrapper>(2500);
+
+ pointerSize = IntPtr.Size;
+
+ RunTest(Arr);
+ GC.KeepAlive(Arr);
+ return 100;
+
+ }
+
+
+ public static void AllocatingPhase(List<ObjectWrapper> Arr, int maxRegions)
+ {
+ int regionSize = regionSizeMB * 1024 * 1024;
+ //decide how many regions to allocate
+ long size = maxAllocation - (long)EstimatedHeapSize;
+ long regionsToAllocate = size / (long)(regionSize);
+
+ if (regionsToAllocate <= 0)
+ {
+ System.Threading.Thread.Sleep(1000);
+ return;
+ }
+ if (regionsToAllocate > maxRegions)
+ regionsToAllocate = maxRegions;
+ Console.WriteLine("Allocating {0} regions", regionsToAllocate);
+ for (long i = 0; i < regionsToAllocate; i++)
+ {
+ int spaceBucket = Rand.Next(0, sizeBuckets.Length);
+ int objectBucket = Rand.Next(0, sizeBuckets.Length);
+ int pinnedPercentage = 0;
+ if (i % 5 == 0)
+ pinnedPercentage = Rand.Next(0, 10);
+ Region r = new Region(pinnedPercentage, sizeBuckets[spaceBucket].minsize, sizeBuckets[spaceBucket].maxsize, sizeBuckets[objectBucket].minsize, sizeBuckets[objectBucket].maxsize);
+ r.Initialize(Arr);
+ regionList.Add(r);
+ if (i % 3 == 0 && i > 0)
+ DeleteSpaces();
+ }
+ DeleteSpaces();
+ }
+
+
+ //want to create fragmentation in Gen2; when objects in the "spaces" list get in gen2, clear the list.
+ public static void DeleteSpaces()
+ {
+ if (regionList.Count == 0)
+ return;
+ for (int i = regionList.Count - 1; i >= 0; i--)
+ {
+ if (regionList[i].ClearSpaces())
+ {
+ regionList.RemoveAt(i);
+ }
+ }
+ }
+
+
+ public static void SteadyState(List<ObjectWrapper> Arr)
+ {
+ Console.WriteLine("Heap size=" + GC.GetTotalMemory(false));
+ Console.WriteLine("Estimated Heap size=" + EstimatedHeapSize);
+ EstimatedObjectCount = CountTotalObjects(Arr);
+ ClearVisitedFlag(Arr);
+ Console.WriteLine("Before shuffle:EstimatedObjectCount " + EstimatedObjectCount);
+ Console.WriteLine("Heap size=" + GC.GetTotalMemory(false));
+ int iterCount = (int)(EstimatedObjectCount / 30);
+ Console.WriteLine("Shuffle {0} times", iterCount);
+ for (int iter2 = 0; iter2 < iterCount; iter2++)
+ {
+ // Console.WriteLine("Shuffle iter " + iter2);
+ ShuffleReferences(Arr);
+ }
+ EstimatedObjectCount = CountTotalObjects(Arr);
+ ClearVisitedFlag(Arr);
+ Console.WriteLine("After shuffle:EstimatedObjectCount " + EstimatedObjectCount);
+ Console.WriteLine("Heap size=" + GC.GetTotalMemory(false));
+ EstimatedHeapSize = EstimatedObjectCount * AvgObjectSize;
+ Console.WriteLine("Estimated Heap size=" + EstimatedHeapSize);
+ //randomly remove some objects
+
+ if (EstimatedObjectCount >100)
+ RemoveObjects(Arr);
+
+
+ }
+
+ public static void ShuffleReferences(List<ObjectWrapper> Arr)
+ {
+ ClearVisitedFlag(Arr);
+ //Console.WriteLine("Shuffle");
+ EstimatedObjectCount = CountTotalObjects(Arr);
+ // Console.WriteLine("EstimatedObjectCount " + EstimatedObjectCount);
+ int randNumber = Rand.Next(0, (int)EstimatedObjectCount); //Console.WriteLine(randNumber);
+ int randNumber2 = Rand.Next(0, (int)EstimatedObjectCount); //Console.WriteLine(randNumber2);
+ PickObject(Arr, randNumber);
+
+ ObjectWrapper Object1 = staticObject;
+ for (int i = 0; i < Object1.m_data.Length; i++)
+ {
+ Object1.m_data[i] = (byte)(Object1.m_data[i] + randNumber);
+ }
+ PickObject(Arr, randNumber2);
+ for (int i = 0; i < staticObject.m_data.Length; i++)
+ {
+ staticObject.m_data[i] = (byte)(staticObject.m_data[i] + randNumber2);
+ }
+
+ if (Object1 != null)
+ {
+ Object1.ref1 = staticObject;
+ // Console.Write("Set ref from {0}", Object1.m_dataSize);
+ // if (staticObject != null)
+ // Console.WriteLine("to " + staticObject.m_dataSize);
+ }
+
+ }
+
+ public static void PickObject(List<ObjectWrapper> Arr, int index)
+ {
+ ClearVisitedFlag(Arr);
+ staticObject=null;
+ staticIndex = 0;
+ for (int i = 0; i < Arr.Count; i++)
+ {
+ //Console.WriteLine("in Arr, pos=" + i);
+ if (staticObject != null)
+ return;
+ // Console.WriteLine("now pick object in Arr, pos=" + i);
+ PickObject(Arr[i], index);
+ }
+
+ for (int i = 0; i < staticArr.Count; i++)
+ {
+ // Console.WriteLine("in staticArr, pos=" + i);
+ if (staticObject != null)
+ return;
+ // Console.WriteLine("now pick object in static Arr, pos=" + i);
+ PickObject(staticArr[i], index);
+ }
+ }
+
+ public static void PickObject(ObjectWrapper o, int index)
+ {
+ if (o.visited)
+ {
+ return;
+ }
+ o.visited = true;
+ // Console.WriteLine("Try Pick object" + staticIndex);
+
+ if(staticObject != null)
+ return;
+ if (staticIndex == index)
+ {
+ // Console.WriteLine("Object {0}; found for index {1}", o.m_dataSize, staticIndex);
+ staticObject = o;
+ return;
+ }
+
+ staticIndex++;
+
+
+ if (o.ref1 != null && staticObject == null)
+ PickObject(o.ref1, index);
+ if (o.ref2 != null && staticObject == null)
+ PickObject(o.ref2, index);
+ if (o.ref3 != null && staticObject == null)
+ PickObject(o.ref3, index);
+ if (o.arrayRefs != null && staticObject == null)
+ {
+ for (int i = 0; i < o.arrayRefs.Length; i++)
+ {
+ if (o.arrayRefs[i] != null && staticObject == null)
+ PickObject(o.arrayRefs[i], index);
+ }
+ }
+ }
+ public static void RemoveObjects(List<ObjectWrapper> Arr)
+ {
+ /*
+ int CountPinned = CountPinnedObjects(Arr);
+ Console.WriteLine("pinned objects, before removing= " + CountPinned);
+ int Count = CountTotalObjects(Arr);
+ Console.WriteLine("total objects, before removing= " + Count);
+ Console.WriteLine("percentage pinned " + (float)CountPinned * 100.0f / (float)Count);
+ */
+ Console.WriteLine("Removing Objects");
+ //Console.WriteLine("before: Arr.Count " + Arr.Count);
+ for (int i = Arr.Count - 1; i >= 0; i--)
+ {
+ if (i % 4 == 0)
+ {
+ if (GC.GetGeneration(Arr[i]) == 2)
+ {
+ Arr.RemoveAt(i);
+ }
+ }
+ }
+ //Console.WriteLine("after: Arr.Count" + Arr.Count);
+ //Console.WriteLine("before: staticArr.Count " + staticArr.Count);
+ for (int j = staticArr.Count - 1; j >= 0; j--)
+ {
+ if (j % 4 == 0)
+ {
+ if (GC.GetGeneration(staticArr[j]) == 2)
+ staticArr.RemoveAt(j);
+ }
+ }
+ //Console.WriteLine("after: staticArr.Count " + staticArr.Count);
+ // Console.WriteLine("before: gcHandleArr.Count " + gcHandleArr.Count);
+
+ //Console.WriteLine("before: gcHandleArr.Count " + gcHandleArr.Count);
+ //remove weak handles for dead objects
+
+ EstimatedObjectCount = CountTotalObjects(Arr);
+ EstimatedHeapSize = EstimatedObjectCount * AvgObjectSize;
+ //Console.WriteLine("After removing objects: Estimated Heap size= " + EstimatedHeapSize);
+ }
+
+
+
+ //estimate the total number of objects in the reference graph
+ public static int CountTotalObjects(List<ObjectWrapper> Arr)
+ {
+ ClearVisitedFlag(Arr);
+ // Console.WriteLine("Counting Objects..");
+ //use the "visited" table
+ int runningCount = 0;
+
+ for (int i = 0; i < Arr.Count; i++)
+ {
+ runningCount += CountReferences(Arr[i]);
+ }
+
+ for (int i = 0; i < staticArr.Count; i++)
+ {
+ runningCount += CountReferences(staticArr[i]);
+ }
+ // Console.WriteLine("Counted {0} objects", runningCount);
+ return runningCount;
+ }
+
+ public static int CountPinnedObjects(List<ObjectWrapper> Arr)
+ {
+ ClearVisitedFlag(Arr);
+ Console.WriteLine("Counting Objects..");
+ //use the "visited" table
+ int runningCount = 0;
+
+ for (int i = 0; i < Arr.Count; i++)
+ {
+ runningCount += CountPinnedReferences(Arr[i]);
+ }
+
+ for (int i = 0; i < staticArr.Count; i++)
+ {
+ runningCount += CountPinnedReferences(staticArr[i]);
+ }
+ Console.WriteLine("Counted {0} objects", runningCount);
+ return runningCount;
+ }
+
+ public static void ClearVisitedFlag(List<ObjectWrapper> Arr)
+ {
+ // Console.WriteLine("Clearing flag..");
+
+ for (int i = 0; i < Arr.Count; i++)
+ {
+ ClearVisitedFlag(Arr[i]);
+ }
+
+ for (int i = 0; i < staticArr.Count; i++)
+ {
+ ClearVisitedFlag(staticArr[i]);
+ }
+ }
+
+ //counts the refernces of this objects
+ public static int CountReferences(ObjectWrapper o)
+ {
+ if (o.visited)
+ {
+ return 0;
+ }
+ else
+ o.visited = true; ;
+ int count = 1;
+
+ if (o.ref1 != null)
+ count+= CountReferences(o.ref1);
+ if (o.ref2 != null)
+ count+= CountReferences(o.ref2);
+ if (o.ref3 != null)
+ count+= CountReferences(o.ref3);
+ if (o.arrayRefs != null)
+ {
+ for (int i = 0; i < o.arrayRefs.Length; i++)
+ {
+ if (o.arrayRefs[i] != null)
+ {
+ count += CountReferences(o.arrayRefs[i]);
+ }
+ }
+ }
+ return count;
+ }
+
+ public static void ClearVisitedFlag(ObjectWrapper o)
+ {
+ if (!o.visited)
+ {
+ return;
+ }
+ else
+ o.visited = false;
+
+ if (o.ref1 != null)
+ ClearVisitedFlag(o.ref1);
+ if (o.ref2 != null)
+ ClearVisitedFlag(o.ref2);
+ if (o.ref3 != null)
+ ClearVisitedFlag(o.ref3);
+ if (o.arrayRefs != null)
+ {
+ for (int i = 0; i < o.arrayRefs.Length; i++)
+ {
+ if (o.arrayRefs[i] != null)
+ {
+ ClearVisitedFlag(o.arrayRefs[i]);
+ }
+ }
+ }
+
+ }
+ //counts the pinned refernces of this objects
+ public static int CountPinnedReferences(ObjectWrapper o)
+ {
+ if (o.visited)
+ {
+ return 0;
+ }
+ else
+ o.visited=true;
+ int count = 0;
+ if (o.m_pinned)
+ count = 1;
+
+ if (o.ref1 != null)
+ count += CountPinnedReferences(o.ref1);
+ if (o.ref2 != null)
+ count += CountPinnedReferences(o.ref2);
+ if (o.ref3 != null)
+ count += CountPinnedReferences(o.ref3);
+ if (o.arrayRefs != null)
+ {
+ for (int i = 0; i < o.arrayRefs.Length; i++)
+ {
+ if (o.arrayRefs[i] != null)
+ {
+ count += CountPinnedReferences(o.arrayRefs[i]);
+ }
+ }
+ }
+ return count;
+ }
+
+
+
+ public static void UpdateAvg()
+ {
+ AvgObjectSize = (double)EstimatedHeapSize / (double)EstimatedObjectCount;
+ //Console.WriteLine("Avg object size " + AvgObjectSize);
+
+ }
+
+ public static void AddRef(Object from, Object to)
+ {
+ Object[] arrFrom = from as Object[];
+ for (int i = 0; i < arrFrom.Length; i++)
+ {
+ if (arrFrom[i] == null)
+ {
+ arrFrom[i] = to;
+ break;
+ }
+ }
+
+ }
+
+
+
+ public static void RunTest(List<ObjectWrapper> Arr)
+ {
+ System.Diagnostics.Stopwatch threadStopwatch = new System.Diagnostics.Stopwatch();
+ threadStopwatch.Start();
+
+ int iter = 0;
+ while (true)
+ {
+ Console.WriteLine("Allocating phase. Start at {0}", DateTime.Now);
+ AllocatingPhase(Arr, 20);
+
+ Console.WriteLine("starting steady state. Time is {0}", DateTime.Now);
+ SteadyState(Arr);
+ Console.WriteLine("End steady state. Time is {0}", DateTime.Now);
+ iter++;
+
+ if (timeBased)
+ {
+ if (threadStopwatch.ElapsedMilliseconds / 1000 > timeout)
+ break;
+ }
+ else //not timebased
+ {
+ if (iter >= countIters)
+ break;
+ }
+ }
+
+ }
+
+
+
+ public static void InitializeSizeBuckets()
+ {
+ sizeBuckets[0] = new SizeBucket(BUCKET1_MIN, BUCKET2_MIN);
+ sizeBuckets[1] = new SizeBucket(BUCKET2_MIN, BUCKET3_MIN);
+ sizeBuckets[2] = new SizeBucket(BUCKET3_MIN, BUCKET4_MIN);
+ sizeBuckets[3] = new SizeBucket(BUCKET4_MIN, BUCKETS_MAX);
+ }
+ /// Parse the arguments and also initialize values that are not set by args
+ public static bool ParseArgs(string[] args)
+ {
+ randomSeed = (int)DateTime.Now.Ticks;
+
+ try
+ {
+ for (int i = 0; i < args.Length; ++i)
+ {
+ string currentArg = args[i]; //Console.WriteLine(currentArg);
+ string currentArgValue;
+ if (currentArg.StartsWith("-") || currentArg.StartsWith("/"))
+ {
+ currentArg = currentArg.Substring(1);
+ }
+ else
+ {
+ Console.WriteLine("Error! Unexpected argument {0}", currentArg);
+ return false;
+ }
+
+ if (currentArg.StartsWith("?"))
+ {
+ Usage();
+ return false;
+ }
+ else if (String.Compare(currentArg.ToLower(), "iter") == 0) // number of iterations
+ {
+ currentArgValue = args[++i];
+ countIters = Int32.Parse(currentArgValue);
+ timeBased = false;
+ }
+ else if (String.Compare(currentArg.ToLower(), "maxheapmb") == 0)
+ {
+ currentArgValue = args[++i];
+ maxHeapMB = Int32.Parse(currentArgValue);
+ }
+ else if (String.Compare(currentArg.ToLower(), "regionsizemb") == 0)
+ {
+ currentArgValue = args[++i];
+ regionSizeMB = Int32.Parse(currentArgValue);
+ }
+ else if (String.Compare(currentArg.ToLower(), "timeout") == 0) //seconds; if 0 run forever
+ {
+ currentArgValue = args[++i];
+ timeout = Int64.Parse(currentArgValue);
+ if (timeout == -1)
+ {
+ timeout = Int64.MaxValue;
+ }
+ }
+ else if (String.Compare(currentArg.ToLower(), "randomseed") == 0) // number of iterations
+ {
+ currentArgValue = args[++i];
+ randomSeed = Int32.Parse(currentArgValue);
+ }
+ else if (String.Compare(currentArg.ToLower(), "depth") == 0) // number of iterations
+ {
+ currentArgValue = args[++i];
+ maxDepth = Int32.Parse(currentArgValue);
+ }
+ else
+ {
+ Console.WriteLine("Error! Unexpected argument {0}", currentArg);
+ return false;
+ }
+
+ }
+ }
+ catch (System.Exception e)
+ {
+ Console.WriteLine("Incorrect arguments");
+ Console.WriteLine(e.ToString());
+ return false;
+ }
+
+ //do some basic checking of the arguments
+ if (countIters < 1)
+ {
+ Console.WriteLine("Incorrect values for arguments");
+ return false;
+ }
+ InitializeSizeBuckets();
+
+ Console.WriteLine("Repro with: ");
+ Console.WriteLine("==============================");
+ if (timeBased)
+ Console.WriteLine("-timeout " + timeout);
+ else
+ Console.WriteLine("-iter " + countIters);
+ Console.WriteLine("-maxHeapMB " + maxHeapMB);
+ Console.WriteLine("-regionSizeMB " + regionSizeMB);
+ Console.WriteLine("-randomseed " + randomSeed);
+ Console.WriteLine("-depth " + maxDepth);
+ Console.WriteLine("==============================");
+ return true;
+ }
+
+
+ public static void Usage()
+ {
+ Console.WriteLine("ECO1 [options]");
+ Console.WriteLine("\nOptions");
+ Console.WriteLine("-? Display the usage and exit");
+ Console.WriteLine("-iter <num iterations> : specify number of iterations for the test, default is " + countIters);
+ Console.WriteLine("If using time based instead of iterations:");
+ Console.WriteLine("-timeout <seconds> : when to stop the test, default is " + timeout);
+ Console.WriteLine("-maxHeapMB <MB> : max heap size in MB to allocate, default is " + maxHeapMB);
+ Console.WriteLine("-regionSizeMB <MB> : regionSize, default is " + regionSizeMB);
+ Console.WriteLine("-depth <depth of refernce tree>, default is " + maxDepth);
+
+ Console.WriteLine("-randomseed <seed> : random seed(for repro)");
+ }
+
+ public class Region
+ {
+ public List<Object> Spaces = new List<Object>(2500);
+
+ public int depth;
+ public int size = 0; //bytes
+ public float pinnedPercentage;
+ public int pinnedCount = 0;
+ public int objectCount = 0;
+ public int minObjectSize;
+ public int maxObjectsize;
+ public int minSpaceSize;
+ public int maxSpaceSize;
+
+ //create an empty region
+ public Region(float pinnedPercentage, int minSpace, int maxSpace, int minObject, int maxObject)
+ {
+ this.pinnedPercentage = pinnedPercentage;
+ minSpaceSize = minSpace;
+ maxSpaceSize = maxSpace;
+ minObjectSize = minObject;
+ maxObjectsize = maxObject;
+
+ }
+
+ //add objects to region
+ public void Initialize(List<ObjectWrapper> Arr)
+ {
+ while (size < regionSizeMB*1024*1024)
+ {
+ //create an object with the characteristics(size, pinned) of this region. The object is added either o the static array or to Arr
+ bool useStatic = Rand.Next(0, 2) == 0 ? true : false;
+
+ if (useStatic)
+ staticArr.Add(ObjectWrapper.AddObject(this, 0, null));
+ else
+ Arr.Add(ObjectWrapper.AddObject(this, 0, null));
+
+ }
+
+ UpdateAvg();
+ }
+
+ public bool ClearSpaces()
+ {
+ if (Spaces.Count <= 0)
+ {
+ Console.WriteLine("Spaces.Count <= 0");
+ return false;
+ }
+ if (GC.GetGeneration(Spaces[Spaces.Count - 1]) == 2)
+ {
+ Spaces.Clear();
+ return true;
+ }
+ return false;
+ }
+
+ }
+
+ public class ObjectWrapper
+ {
+ public bool visited = false;
+ public ObjectWrapper parent = null;
+ public GCHandle m_pinnedHandle;
+ public bool m_pinned = false;
+ public ObjectWrapper ref1;
+ public ObjectWrapper ref2;
+ public ObjectWrapper ref3;
+ public byte[] m_data;
+ public ObjectWrapper[] arrayRefs = null;
+ public int m_dataSize;
+ public int depth = 0;
+
+ public static ObjectWrapper AddObject(Region r, int depth, ObjectWrapper Parent)
+ {
+
+ if (r.size >= regionSizeMB * 1024 * 1024 || depth>maxDepth)
+ return null;
+ byte[] Temp = new byte[Rand.Next(50, 200)];
+ int size = Rand.Next(r.minObjectSize, r.maxObjectsize);
+
+ bool pinned = false;
+ if ((r.pinnedCount * 100.0 / (double)r.objectCount) < r.pinnedPercentage)
+ {
+ pinned = true;
+ r.pinnedCount++;
+ }
+ int randNumber = Rand.Next(0, 20);
+ bool arrayrefs = false;
+ if (randNumber == 1)
+ arrayrefs = true;
+ int references = Rand.Next(0, 3);
+ int arrayrefCount = 0;
+ if (arrayrefs)
+ {
+ arrayrefCount = Rand.Next(10, 100);
+ references = Rand.Next(3, arrayrefCount);
+ }
+
+
+ ObjectWrapper ow = new ObjectWrapper(size, pinned, references, arrayrefs, arrayrefCount, depth);
+ if (randNumber == 7)
+ ow.parent = Parent;
+
+ if (!arrayrefs) //object has up to 3 references to other objects
+ {
+ if (references > 0)
+ {
+ ow.ref1 = AddObject(r, ow.depth+1, ow);
+ }
+ if (references > 1)
+ {
+ ow.ref2 = AddObject(r, ow.depth + 1, ow);
+ }
+ if (references > 2)
+ {
+ ow.ref3 = AddObject(r, ow.depth + 1, ow);
+ }
+ }
+ else //object has an array of references
+ {
+ for (int i = 0; i < arrayrefCount; i++)
+ {
+ ow.arrayRefs[i] = AddObject(r, depth+1, ow);
+ }
+ }
+ r.size += size;
+
+
+ int spaceSize = Rand.Next(r.minSpaceSize, r.maxSpaceSize);
+ r.Spaces.Add(new byte[spaceSize]);
+
+ r.size += spaceSize;
+ r.objectCount++;
+ EstimatedObjectCount++;
+ EstimatedHeapSize += size;
+ return ow;
+ }
+ public ObjectWrapper(int datasize, bool pinned, int references, bool arrayrefs, int arrayRefCount, int depth)
+ {
+ this.depth = depth;
+ //we want m_data to have an approximate size of dataSize
+ m_dataSize = datasize;
+ m_pinned = pinned;
+
+ m_data = new byte[datasize];
+ for (int i = 0; i < datasize; i++)
+ {
+ m_data[i] = (byte)(references - i);
+ }
+ if(pinned)
+ m_pinnedHandle = GCHandle.Alloc(m_data, GCHandleType.Pinned);
+
+ if (arrayrefs)
+ {
+ arrayRefs = new ObjectWrapper[arrayRefCount];
+ }
+
+
+ }
+ public void CleanUp()
+ {
+ if (m_pinned)
+ {
+ if (m_pinnedHandle.IsAllocated)
+ {
+ m_pinnedHandle.Free();
+ }
+ }
+ GC.SuppressFinalize(this);
+ }
+ ~ObjectWrapper()
+ {
+ CleanUp();
+ }
+
+ }
+
+ }
+}
diff --git a/tests/src/GC/Features/PartialCompaction/eco1.csproj b/tests/src/GC/Features/PartialCompaction/eco1.csproj
new file mode 100644
index 0000000000..c6021a3625
--- /dev/null
+++ b/tests/src/GC/Features/PartialCompaction/eco1.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="ECO1.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/PartialCompaction/partialcompactiontest.cs b/tests/src/GC/Features/PartialCompaction/partialcompactiontest.cs
new file mode 100644
index 0000000000..4108765fed
--- /dev/null
+++ b/tests/src/GC/Features/PartialCompaction/partialcompactiontest.cs
@@ -0,0 +1,698 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Runtime.InteropServices;
+
+//Test for Partial Compaction
+//Goals: create fragmentation in Gen2
+//Allocation should not be too intense
+//For testing the concurrent phase of partial compaction: update references between objects
+//What the test does:
+// 1.Allocating phase:
+//-Allocate n regions
+//-When objects get in Gen2 release the objects used to create spaces
+//-Create refs from objects in these regions to ephemeral objects
+// 2.Steady state
+//- randomly change references between objects
+//- release some of the existing objects (to create fragmentation in the existing regions)
+// Repeat from 1.
+namespace PartialCompactionTest
+{
+ public class PartialCompactionTest
+ {
+
+ //Define the size buckets:
+ public struct SizeBucket
+ {
+ public int minsize;
+ public int maxsize;
+ //public float percentage; //percentage of objects that fall into this bucket
+ public SizeBucket(int min, int max)
+ {
+ //
+ minsize = min;
+ maxsize = max;
+ }
+
+ }
+
+ //Buckets are defined as following:
+ //Bucket1: 17 bytes to 200 bytes
+ //Bucket2: 200bytes to 1000 bytes
+ //Bucket3: 1000 bytes to 10000 bytes
+ //Bucket4: 10000 bytes to 80000 bytes
+ //The rest is over 85000 bytes (Large Object Heap)
+ private const int SIZEBUCKET_COUNT = 4;
+ private const int BUCKET1_MIN = 50;
+ private const int BUCKET2_MIN = 200;
+ private const int BUCKET3_MIN = 1000;
+ private const int BUCKET4_MIN = 10000;
+ private const int BUCKETS_MAX = 80000;
+ //////
+
+ public const int DEFAULT_ITERATIONS = 100;
+ public static int countIters = DEFAULT_ITERATIONS;
+ public static long timeout = 600; //seconds
+ public static SizeBucket[] sizeBuckets = new SizeBucket[SIZEBUCKET_COUNT];
+ public static int randomSeed;
+
+ public static int pointerSize = 4; //bytes
+ [ThreadStatic]
+ public static Random Rand;
+
+ //new
+ public static bool timeBased = true;
+ public static int maxHeapMB = 100; //max heap in MB
+ public static long maxAllocation; //bytes
+ public static int regionSizeMB = 4; //MB
+ public static double EstimatedHeapSize = 0; //bytes
+ public static double EstimatedObjectCount = 0; //estimate how many objects we have
+ public static List<Object> Visited = new List<Object>(2500); //for estimating the objects count
+ public static double AvgObjectSize = 0; //bytes
+ public static List<Object> staticArr = new List<Object>(2500);
+ public static List<GCHandle> gcHandleArr = new List<GCHandle>(2500);
+ public static List<GCHandle> weakList = new List<GCHandle>(2500);
+ public static List<Region> regionList = new List<Region>(2500);
+ public static Object[] ephemeralList = new Object[2500];
+
+
+ public static int Main(string[] args)
+ {
+ if (!ParseArgs(args))
+ return 101;
+
+ maxAllocation = maxHeapMB * 1024 * 1024;
+ Rand = new Random(randomSeed);
+ List<Object> Arr = new List<Object>(2500);
+
+ pointerSize = IntPtr.Size;
+
+ RunTest(Arr);
+ GC.KeepAlive(Arr);
+ return 100;
+
+ }
+
+ public static Object CreateObject(int size, bool pinned)
+ {
+ if (!pinned)
+ {
+ int sz = size / pointerSize;
+ Object[] o = new Object[sz];
+ for (int i = 0; i < sz; i++)
+ {
+ o[i] = null;
+ }
+ return o;
+ }
+ else
+ {
+ byte[] b = new byte[size];
+ for (int i = 0; i < size; i++)
+ {
+ b[i] = 5;
+ }
+ return b;
+ }
+ }
+
+
+
+
+ public static void InitialAllocation(List<Object> Arr)
+ {
+ for (int i = 0; i < 5; i++)
+ {
+ Object[] o = new Object[3];
+ staticArr.Add(o);
+ weakList.Add(GCHandle.Alloc(o, GCHandleType.Weak));
+
+ }
+ AllocatingPhase(Arr, 50);
+ }
+
+ public static void AllocatingPhase(List<Object> Arr, int maxRegions)
+ {
+ int regionSize = regionSizeMB * 1024 * 1024;
+ //decide how many regions to allocate
+ long size = maxAllocation - (long)EstimatedHeapSize;
+ long regionsToAllocate = size / (long)(regionSize);
+
+ if (regionsToAllocate <= 0)
+ {
+ System.Threading.Thread.Sleep(1000);
+ return;
+ }
+ if (regionsToAllocate > maxRegions)
+ regionsToAllocate = maxRegions;
+ Console.WriteLine("Allocating {0} regions", regionsToAllocate);
+ for (long i = 0; i < regionsToAllocate; i++)
+ {
+ int spaceBucket = Rand.Next(0, sizeBuckets.Length);
+ int objectBucket = Rand.Next(0, sizeBuckets.Length);
+ int pinnedPercentage = 0;
+ if(i%5==0)
+ pinnedPercentage = Rand.Next(0, 10);
+ AllocateRegion(regionSize, pinnedPercentage, sizeBuckets[spaceBucket].minsize, sizeBuckets[spaceBucket].maxsize, sizeBuckets[objectBucket].minsize, sizeBuckets[objectBucket].maxsize, Arr);
+ if(i%3==0 && i>0)
+ DeleteSpaces();
+ if (i % 3 == 0 && i > 3)
+ CleanupRegions();
+ }
+ DeleteSpaces();
+ }
+
+
+ //want to create fragmentation in Gen2; when objects in the "spaces" list get in gen2, clear the list.
+ public static void DeleteSpaces()
+ {
+ if (regionList.Count == 0)
+ return;
+ for (int i = regionList.Count - 1; i >= 0; i--)
+ {
+ Region r = regionList[i];
+ if (r.Spaces.Count <= 0)
+ continue;
+ if (GC.GetGeneration(r.Spaces[r.Spaces.Count - 1]) == 2)
+ {
+ r.ReferenceEphemeralObjects();
+ r.Spaces.Clear();
+ r.Objects.Clear();
+ }
+ }
+ }
+
+ public static void CleanupRegions()
+ {
+ if (regionList.Count == 0)
+ return;
+ for (int i = regionList.Count - 1; i >= 0; i--)
+ {
+ Region r = regionList[i];
+ if (r.Ephemeral != null && r.Ephemeral.Count > 0)
+ {
+ if (GC.GetGeneration(r.Ephemeral[0]) >= 1)
+ {
+ regionList.RemoveAt(i);
+ }
+ }
+ }
+ }
+
+ public static void SteadyState(List<Object> Arr)
+ {
+ Console.WriteLine("Heap size=" + GC.GetTotalMemory(false));
+ Console.WriteLine("Estimated Heap size=" + EstimatedHeapSize);
+ for (int iter2 = 0; iter2 < 100; iter2++)
+ {
+ UpdateReferences();
+ }
+ //randomly remove some objects
+
+ RemoveObjects(Arr);
+ for (int iter3 = 0; iter3 < 100; iter3++)
+ {
+ UpdateReferences();
+ }
+
+
+
+ }
+
+ public static void UpdateReferences()
+ {
+ for (int i = 0; i < weakList.Count; i++)
+ {
+ if (weakList[i].Target == null)
+ continue;
+ Object[] OAr = weakList[i].Target as Object[];
+ if (OAr == null)
+ continue;
+
+
+ for (int j = 0; j < OAr.Length; j++)
+ {
+ if (OAr[j] != null)
+ {
+ int pos = Rand.Next(0, weakList.Count);
+ if (weakList[pos] != null && weakList[pos].IsAllocated)
+ {
+ OAr[j] = weakList[pos].Target;
+ }
+ }
+ }
+ }
+ }
+
+ public static void RemoveObjects(List<Object> Arr)
+ {
+ Console.WriteLine("Removing Objects");
+ //Console.WriteLine("before: Arr.Count " + Arr.Count);
+ for(int i= Arr.Count-1; i>=0; i--)
+ {
+ if (i % 4 == 0)
+ {
+ if(GC.GetGeneration(Arr[i])==2)
+ Arr.RemoveAt(i);
+ }
+ }
+ //Console.WriteLine("after: Arr.Count" + Arr.Count);
+ //Console.WriteLine("before: staticArr.Count " + staticArr.Count);
+ for (int j = staticArr.Count - 1; j >= 0; j--)
+ {
+ if (j % 4 == 0)
+ {
+ if (GC.GetGeneration(staticArr[j]) == 2)
+ staticArr.RemoveAt(j);
+ }
+ }
+ //Console.WriteLine("after: staticArr.Count " + staticArr.Count);
+ // Console.WriteLine("before: gcHandleArr.Count " + gcHandleArr.Count);
+
+ for (int k = gcHandleArr.Count - 1; k >= 0; k--)
+ {
+ if (k % 2 == 0)
+ {
+ if (GC.GetGeneration(gcHandleArr[k].Target) == 2)
+ gcHandleArr[k].Free();
+ gcHandleArr.RemoveAt(k);
+ }
+ }
+ //Console.WriteLine("before: gcHandleArr.Count " + gcHandleArr.Count);
+ //remove weak handles for dead objects
+ CleanupWeakReferenceArr();
+ int objectCount = CountTotalObjects(Arr);
+ Visited.Clear();
+ //if pinned objects are more than 3% remove all of them
+ if ((float)gcHandleArr.Count / (float)objectCount > 0.03f)
+ {
+ Console.WriteLine("removing all pinned objects");
+ RemoveAllPinnedObjects();
+ }
+ //Console.WriteLine("total count " + objectCount);
+ EstimatedHeapSize = objectCount * AvgObjectSize;
+ //Console.WriteLine("After removing objects: Estimated Heap size= " + EstimatedHeapSize);
+ }
+
+ public static void RemoveAllPinnedObjects()
+ {
+ for (int k = 0; k < gcHandleArr.Count; k++)
+ {
+ gcHandleArr[k].Free();
+ }
+ gcHandleArr.Clear();
+ }
+
+ //estimate the total number of objects in the reference graph
+ public static int CountTotalObjects(List<Object> Arr)
+ {
+ Visited.Clear();
+ Console.WriteLine("Counting Objects..");
+ //use the "visited" table
+ int runningCount = 0;
+ // runningCount += CountReferences(Arr[0]);
+ for (int i = 0; i < Arr.Count; i++)
+ {
+ runningCount+= CountReferences(Arr[i]);
+ }
+
+ for (int i = 0; i < staticArr.Count; i++)
+ {
+ runningCount += CountReferences(staticArr[i]);
+ }
+ runningCount += gcHandleArr.Count;
+
+
+ return runningCount;
+ }
+
+ //counts the refernces of this objects
+ public static int CountReferences( Object o)
+ {
+ if (Visited.Contains(o))
+ {
+ return 0;
+ }
+ else
+ Visited.Add(o);
+ int count = 1;
+
+ Object[] oArr = o as Object[];
+ if (oArr == null)
+ return count;
+ for (int i = 0; i < oArr.Length; i++)
+ {
+ if (oArr[i] != null)
+ {
+ count += CountReferences(oArr[i]);
+ }
+ }
+
+ return count;
+ }
+ public static void CleanupWeakReferenceArr()
+ {
+ for (int k = weakList.Count - 1; k >= 0; k--)
+ {
+ if (weakList[k] == null || !(weakList[k].IsAllocated))
+ {
+ weakList.RemoveAt(k);
+ }
+ else if (weakList[k].Target == null)
+ {
+ weakList[k].Free();
+ weakList.RemoveAt(k);
+ }
+ }
+ }
+ public static int AllocateRegion(int regionSize, float pinnedPercentage, int minSpace, int maxSpace, int minObject, int maxObject, List<Object> Arr)
+ {
+ int sizeCounter = 0;
+ double pinnedCount = 0;
+ double objectCount = 0;
+ Object o;
+
+ Region r = new Region();
+ regionList.Add(r);
+ while (sizeCounter < regionSize)
+ {
+ byte[] Temp = new byte[Rand.Next(50, 200)];
+ int objSize = Rand.Next(minObject, maxObject); //Console.WriteLine("Objsize " + objSize);
+ if ((pinnedCount * 100.0 / objectCount) < pinnedPercentage)
+ {
+ AddPinnedObject(objSize);
+ pinnedCount++;
+ }
+ else
+ {
+ o = AddObject(objSize, Arr);
+ r.Objects.Add(o);
+ }
+
+ int spaceSize = Rand.Next(minSpace, maxSpace);
+ r.Spaces.Add(new byte[spaceSize]);
+
+ sizeCounter += objSize;
+ sizeCounter += spaceSize;
+ objectCount++;
+ EstimatedObjectCount ++;
+ EstimatedHeapSize += objSize;
+
+ }
+
+ UpdateAvg();
+ return sizeCounter;
+ }
+
+ public static void UpdateAvg()
+ {
+ AvgObjectSize = (double)EstimatedHeapSize / (double)EstimatedObjectCount;
+ //Console.WriteLine("Avg object size " + AvgObjectSize);
+ }
+ public static void AddPinnedObject(int objSize)
+ {
+ gcHandleArr.Add(GCHandle.Alloc(CreateObject(objSize, true), GCHandleType.Pinned));
+ }
+
+ public static void AddRef(Object from, Object to)
+ {
+ Object[] arrFrom = from as Object[];
+ for (int i = 0; i < arrFrom.Length; i++)
+ {
+ if (arrFrom[i] == null)
+ {
+ arrFrom[i] = to;
+ break;
+ }
+ }
+
+ }
+
+ //add ref from this object to existing objects
+ public static void AddRefFrom(Object from)
+ {
+ int pos = Rand.Next(0, weakList.Count);
+ bool found = false;
+ while (!found)
+ {
+ pos = Rand.Next(0, weakList.Count);
+ if (weakList[pos] == null || !weakList[pos].IsAllocated)
+ continue;
+ if (weakList[pos].Target != null)
+ {
+ AddRef(from, weakList[pos].Target);
+ found = true;
+ }
+ }
+ }
+
+ //add ref from this object to existing objects
+ public static void AddRefTo(Object to)
+ {
+ int pos = Rand.Next(0, weakList.Count);
+ bool found = false;
+ while (!found)
+ {
+ pos = Rand.Next(0, weakList.Count);
+ if (weakList[pos] == null || !weakList[pos].IsAllocated)
+ continue;
+ if (weakList[pos].Target != null)
+ {
+ AddRef(weakList[pos].Target, to);
+ found = true;
+ }
+ }
+ }
+
+ //add as reference to existing objects
+ public static Object AddObject(int size, List<Object> Arr)
+ {
+ bool found = false;
+ Object[] o = new Object[size / pointerSize];
+ int r = Rand.Next(0, 10);
+ if (r == 0)
+ {
+ staticArr.Add(o);
+ //add ref from this object to existing objects
+ AddRefFrom(o);
+ }
+ else if (r == 1)
+ {
+ Arr.Add(o);
+ AddRefFrom(o);
+ }
+ else
+ {
+ //add as reference to existing objects
+ AddRefTo(o);
+
+ }
+
+ //find an empty place in array
+ found = false;
+ for (int i = 0; i < weakList.Count; i++)
+ {
+ if (weakList[i] == null || !weakList[i].IsAllocated)
+ {
+ weakList[i] = GCHandle.Alloc(o, GCHandleType.Weak);
+ found = true;
+ }
+ }
+ if(!found)
+ weakList.Add(GCHandle.Alloc(o, GCHandleType.Weak));
+ return o;
+ }
+
+ public static void AddEphemeralObject(int size)
+ {
+ for(int i=0; i<ephemeralList.Length; i++)
+ {
+ if(ephemeralList[i]==null || (GC.GetGeneration(ephemeralList[i])>=1))
+ {
+ ephemeralList[i] = new byte[size];
+ break;
+ }
+
+ }
+ }
+
+ public static void RunTest(List<Object> Arr)
+ {
+ System.Diagnostics.Stopwatch threadStopwatch = new System.Diagnostics.Stopwatch();
+ threadStopwatch.Start();
+
+
+
+ //Steady state: objects die and others are created
+
+ int iter = 0;
+ while (true)
+ {
+ Console.WriteLine("Allocating phase. Start at {0}", DateTime.Now);
+ if(iter==0)
+ InitialAllocation(Arr);
+ else
+ AllocatingPhase(Arr, 20);
+
+ Console.WriteLine("starting steady state. Time is {0}", DateTime.Now);
+ SteadyState(Arr);
+ Console.WriteLine("End steady state. Time is {0}", DateTime.Now);
+ iter++;
+
+ if (timeBased)
+ {
+ if (threadStopwatch.ElapsedMilliseconds / 1000 > timeout)
+ break;
+ }
+ else //not timebased
+ {
+ if(iter>=countIters)
+ break;
+ }
+ }
+
+ }
+
+
+
+ public static void InitializeSizeBuckets()
+ {
+ sizeBuckets[0] = new SizeBucket(BUCKET1_MIN, BUCKET2_MIN);
+ sizeBuckets[1] = new SizeBucket(BUCKET2_MIN, BUCKET3_MIN);
+ sizeBuckets[2] = new SizeBucket(BUCKET3_MIN, BUCKET4_MIN);
+ sizeBuckets[3] = new SizeBucket(BUCKET4_MIN, BUCKETS_MAX);
+ }
+ /// Parse the arguments and also initialize values that are not set by args
+ public static bool ParseArgs(string[] args)
+ {
+ randomSeed = (int)DateTime.Now.Ticks;
+
+ try
+ {
+ for (int i = 0; i < args.Length; ++i)
+ {
+ string currentArg = args[i]; //Console.WriteLine(currentArg);
+ string currentArgValue;
+ if (currentArg.StartsWith("-") || currentArg.StartsWith("/"))
+ {
+ currentArg = currentArg.Substring(1);
+ }
+ else
+ {
+ Console.WriteLine("Error! Unexpected argument {0}", currentArg);
+ return false;
+ }
+
+ if (currentArg.StartsWith("?"))
+ {
+ Usage();
+ return false;
+ }
+ else if (String.Compare(currentArg.ToLower(), "iter") == 0) // number of iterations
+ {
+ currentArgValue = args[++i];
+ countIters = Int32.Parse(currentArgValue);
+ timeBased = false;
+ }
+ else if (String.Compare(currentArg.ToLower(), "maxheapmb") == 0)
+ {
+ currentArgValue = args[++i];
+ maxHeapMB = Int32.Parse(currentArgValue);
+ }
+ else if (String.Compare(currentArg.ToLower(), "regionsizemb") == 0)
+ {
+ currentArgValue = args[++i];
+ regionSizeMB = Int32.Parse(currentArgValue);
+ }
+ else if (String.Compare(currentArg.ToLower(), "timeout") == 0) //seconds; if 0 run forever
+ {
+ currentArgValue = args[++i];
+ timeout = Int64.Parse(currentArgValue);
+ if (timeout == -1)
+ {
+ timeout = Int64.MaxValue;
+ }
+ }
+ else if (String.Compare(currentArg.ToLower(), "randomseed") == 0) // number of iterations
+ {
+ currentArgValue = args[++i];
+ randomSeed = Int32.Parse(currentArgValue);
+ }
+ else
+ {
+ Console.WriteLine("Error! Unexpected argument {0}", currentArg);
+ return false;
+ }
+
+ }
+ }
+ catch (System.Exception e)
+ {
+ Console.WriteLine("Incorrect arguments");
+ Console.WriteLine(e.ToString());
+ return false;
+ }
+
+ //do some basic checking of the arguments
+ if (countIters < 1 )
+ {
+ Console.WriteLine("Incorrect values for arguments");
+ return false;
+ }
+ InitializeSizeBuckets();
+
+ Console.WriteLine("Repro with: ");
+ Console.WriteLine("==============================");
+ if(timeBased)
+ Console.WriteLine("-timeout " + timeout);
+ else
+ Console.WriteLine("-iter " + countIters);
+ Console.WriteLine("-maxHeapMB " + maxHeapMB);
+ Console.WriteLine("-regionSizeMB " + regionSizeMB);
+ Console.WriteLine("-randomseed " + randomSeed);
+ Console.WriteLine("==============================");
+ return true;
+ }
+
+
+ public static void Usage()
+ {
+ Console.WriteLine("PartialCompactionTest [options]");
+ Console.WriteLine("\nOptions");
+ Console.WriteLine("-? Display the usage and exit");
+ Console.WriteLine("-iter <num iterations> : specify number of iterations for the test, default is " + countIters);
+ Console.WriteLine("If using time based instead of iterations:");
+ Console.WriteLine("-timeout <seconds> : when to stop the test, default is " + timeout);
+ Console.WriteLine("-maxHeapMB <MB> : max heap size in MB to allocate, default is " + maxHeapMB);
+ Console.WriteLine("-regionSizeMB <MB> : regionSize, default is " + regionSizeMB);
+
+ Console.WriteLine("-randomseed <seed> : random seed(for repro)");
+ }
+
+ public class Region
+ {
+ public List<Object> Spaces = new List<Object>(2500);
+ public List<Object> Objects = new List<Object>(2500);
+ public List<Object> Ephemeral = new List<Object>(2500);
+ public void ReferenceEphemeralObjects()
+ {
+ //create refs from ephemeral objects to gen2 objects
+ if (GC.GetGeneration(Objects[0]) == 2)
+ {
+ int size = Rand.Next(30, 20000);
+ Object[] eph = new Object[size];
+ Ephemeral.Add(eph);
+ AddRef(eph, Objects[Rand.Next(0, Objects.Count)]);
+ }
+ Objects.Clear();
+ }
+ }
+
+ }
+}
diff --git a/tests/src/GC/Features/PartialCompaction/partialcompactiontest.csproj b/tests/src/GC/Features/PartialCompaction/partialcompactiontest.csproj
new file mode 100644
index 0000000000..8ccc632a07
--- /dev/null
+++ b/tests/src/GC/Features/PartialCompaction/partialcompactiontest.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="PartialCompactionTest.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/PartialCompaction/partialcompactionwloh.cs b/tests/src/GC/Features/PartialCompaction/partialcompactionwloh.cs
new file mode 100644
index 0000000000..6f0ea57028
--- /dev/null
+++ b/tests/src/GC/Features/PartialCompaction/partialcompactionwloh.cs
@@ -0,0 +1,758 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Runtime.InteropServices;
+using System.Runtime;
+
+//Test for Partial Compaction
+//Goals: create fragmentation in Gen2
+//Allocation should not be too intense
+//For testing the concurrent phase of partial compaction: update references between objects
+//This test also had LOH objects and creates fragmentation in LOH
+//What the test does:
+// 1.Allocating phase:
+//-Allocate n regions
+//-When objects get in Gen2 release the objects used to create spaces
+//-Create refs from objects in these regions to ephemeral objects
+// 2.Steady state
+//- randomly change references between objects
+//- release some of the existing objects (to create fragmentation in the existing regions)
+// Repeat from 1.
+namespace PartialCompactionTest
+{
+ public class PartialCompactionTest
+ {
+
+ //Define the size buckets:
+ public struct SizeBucket
+ {
+ public int minsize;
+ public int maxsize;
+ //public float percentage; //percentage of objects that fall into this bucket
+ public SizeBucket(int min, int max)
+ {
+ //
+ minsize = min;
+ maxsize = max;
+ }
+
+ }
+
+ //Buckets are defined as following:
+ //Bucket1: 17 bytes to 200 bytes
+ //Bucket2: 200bytes to 1000 bytes
+ //Bucket3: 1000 bytes to 10000 bytes
+ //Bucket4: 10000 bytes to 80000 bytes
+ //The rest is over 85000 bytes (Large Object Heap)
+ private const int SIZEBUCKET_COUNT = 4;
+ private const int BUCKET1_MIN = 50;
+ private const int BUCKET2_MIN = 200;
+ private const int BUCKET3_MIN = 1000;
+ private const int BUCKET4_MIN = 10000;
+ private const int BUCKETS_MAX = 80000;
+ //////
+
+ public const int DEFAULT_ITERATIONS = 100;
+ public static int countIters = DEFAULT_ITERATIONS;
+ public static long timeout = 600; //seconds
+ public static SizeBucket[] sizeBuckets = new SizeBucket[SIZEBUCKET_COUNT];
+ public static int randomSeed;
+
+ public static int pointerSize = 4; //bytes
+ [ThreadStatic]
+ public static Random Rand;
+
+ //new
+ public static bool timeBased = true;
+ public static int maxHeapMB = 100; //max heap in MB
+ public static long maxAllocation; //bytes
+ public static int regionSizeMB = 4; //MB
+ public static double EstimatedHeapSize = 0; //bytes
+ public static double EstimatedObjectCount = 0; //estimate how many objects we have
+ public static List<Object> Visited = new List<Object>(2500); //for estimating the objects count
+ public static double AvgObjectSize = 0; //bytes
+ public static List<Object> staticArr = new List<Object>(2500);
+ public static List<GCHandle> gcHandleArr = new List<GCHandle>(2500);
+ public static List<GCHandle> weakList = new List<GCHandle>(2500);
+ public static List<Region> regionList = new List<Region>(2500);
+ public static Object[] ephemeralList = new Object[2500];
+
+
+ public static int Main(string[] args)
+ {
+ if (!ParseArgs(args))
+ return 101;
+
+ maxAllocation = maxHeapMB * 1024 * 1024;
+ Rand = new Random(randomSeed);
+ List<Object> Arr = new List<Object>(2500);
+
+ pointerSize = IntPtr.Size;
+
+ RunTest(Arr);
+ GC.KeepAlive(Arr);
+ return 100;
+
+ }
+
+ public static Object CreateObject(int size, bool pinned)
+ {
+ if (!pinned)
+ {
+ int sz = size / pointerSize;
+ Object[] o = new Object[sz];
+ for (int i = 0; i < sz; i++)
+ {
+ o[i] = null;
+ }
+ return o;
+ }
+ else
+ {
+ byte[] b = new byte[size];
+ for (int i = 0; i < size; i++)
+ {
+ b[i] = 5;
+ }
+ return b;
+ }
+ }
+
+
+
+
+ public static void InitialAllocation(List<Object> Arr)
+ {
+ for (int i = 0; i < 5; i++)
+ {
+ Object[] o = new Object[3];
+ staticArr.Add(o);
+ weakList.Add(GCHandle.Alloc(o, GCHandleType.Weak));
+
+ }
+ AllocatingPhase(Arr, 50);
+ }
+
+ public static void AllocatingPhase(List<Object> Arr, int maxRegions)
+ {
+ int regionSize = regionSizeMB * 1024 * 1024;
+ //decide how many regions to allocate
+ long size = maxAllocation - (long)EstimatedHeapSize;
+ long regionsToAllocate = size / (long)(regionSize);
+
+ if (regionsToAllocate <= 0)
+ {
+ System.Threading.Thread.Sleep(1000);
+ return;
+ }
+ if (regionsToAllocate > maxRegions)
+ regionsToAllocate = maxRegions;
+ Console.WriteLine("Allocating {0} regions", regionsToAllocate);
+ for (long i = 0; i < regionsToAllocate; i++)
+ {
+ bool LOH = false;
+ int randNumber = Rand.Next(0, 20);
+ if (randNumber == 5)
+ LOH = true;
+
+ int pinnedPercentage = 0;
+ if (i % 5 == 0)
+ pinnedPercentage = Rand.Next(0, 10);
+
+ if (!LOH)
+ {
+ int spaceBucket = Rand.Next(0, sizeBuckets.Length);
+ int objectBucket = Rand.Next(0, sizeBuckets.Length);
+
+ AllocateRegion(regionSize, pinnedPercentage, sizeBuckets[spaceBucket].minsize, sizeBuckets[spaceBucket].maxsize, sizeBuckets[objectBucket].minsize, sizeBuckets[objectBucket].maxsize, Arr);
+ }
+ else
+ {
+ Console.WriteLine("Allocating in LOH");
+ int minsize = 85000;
+ int maxsize = 200000;
+ AllocateRegion(regionSize, pinnedPercentage, minsize, maxsize, minsize, maxsize, Arr);
+ }
+ if(i%3==0 && i>0)
+ DeleteSpaces();
+ if (i % 3 == 0 && i > 3)
+ CleanupRegions();
+ }
+ DeleteSpaces();
+ }
+
+
+ //want to create fragmentation in Gen2; when objects in the "spaces" list get in gen2, clear the list.
+ public static void DeleteSpaces()
+ {
+ if (regionList.Count == 0)
+ return;
+ for (int i = regionList.Count - 1; i >= 0; i--)
+ {
+ Region r = regionList[i];
+ if (r.Spaces.Count <= 0)
+ continue;
+ if (GC.GetGeneration(r.Spaces[r.Spaces.Count - 1]) == 2)
+ {
+ r.ReferenceEphemeralObjects();
+ r.Spaces.Clear();
+ r.Objects.Clear();
+ }
+ }
+ }
+
+ public static void CleanupRegions()
+ {
+ if (regionList.Count == 0)
+ return;
+ for (int i = regionList.Count - 1; i >= 0; i--)
+ {
+ Region r = regionList[i];
+ if (r.Ephemeral != null && r.Ephemeral.Count > 0)
+ {
+ if (GC.GetGeneration(r.Ephemeral[0]) >= 1)
+ {
+ regionList.RemoveAt(i);
+ }
+ }
+ }
+ }
+
+ public static void SteadyState(List<Object> Arr)
+ {
+ Console.WriteLine("Heap size=" + GC.GetTotalMemory(false));
+ Console.WriteLine("Estimated Heap size=" + EstimatedHeapSize);
+ for (int iter2 = 0; iter2 < 100; iter2++)
+ {
+ UpdateReferences();
+ int randnumber2 = Rand.Next(0, 3);
+ if (iter2 % 50 == 0 && randnumber2==2)
+ {
+ Console.WriteLine("Setting LOH compaction mode & collect");
+ GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
+ }
+ }
+ //randomly remove some objects
+
+ RemoveObjects(Arr);
+ for (int iter3 = 0; iter3 < 100; iter3++)
+ {
+ UpdateReferences();
+ }
+
+
+
+ }
+
+ public static void UpdateReferences()
+ {
+ for (int i = 0; i < weakList.Count; i++)
+ {
+ if (weakList[i].Target == null)
+ continue;
+ Object[] OAr = weakList[i].Target as Object[];
+ if (OAr == null)
+ continue;
+
+
+ for (int j = 0; j < OAr.Length; j++)
+ {
+ if (OAr[j] != null)
+ {
+ int pos = Rand.Next(0, weakList.Count);
+ if (weakList[pos] != null && weakList[pos].IsAllocated)
+ {
+ OAr[j] = weakList[pos].Target;
+ }
+ }
+ }
+ }
+ }
+
+ public static void RemoveObjects(List<Object> Arr)
+ {
+ Console.WriteLine("Removing Objects");
+ //Console.WriteLine("before: Arr.Count " + Arr.Count);
+ for(int i= Arr.Count-1; i>=0; i--)
+ {
+ if (i % 4 == 0)
+ {
+ if(GC.GetGeneration(Arr[i])==2)
+ Arr.RemoveAt(i);
+ }
+ }
+ //Console.WriteLine("after: Arr.Count" + Arr.Count);
+ //Console.WriteLine("before: staticArr.Count " + staticArr.Count);
+ for (int j = staticArr.Count - 1; j >= 0; j--)
+ {
+ if (j % 4 == 0)
+ {
+ if (GC.GetGeneration(staticArr[j]) == 2)
+ staticArr.RemoveAt(j);
+ }
+ }
+ //Console.WriteLine("after: staticArr.Count " + staticArr.Count);
+ // Console.WriteLine("before: gcHandleArr.Count " + gcHandleArr.Count);
+ for (int k = gcHandleArr.Count - 1; k >= 0; k--)
+ {
+ if (k % 2 == 0)
+ {
+ if (GC.GetGeneration(gcHandleArr[k].Target) == 2)
+ gcHandleArr[k].Free();
+ gcHandleArr.RemoveAt(k);
+ }
+ }
+ //Console.WriteLine("after: gcHandleArr.Count " + gcHandleArr.Count);
+ //remove weak handles for dead objects
+ CleanupWeakReferenceArr();
+ int objectCount = CountTotalObjects(Arr);
+ Visited.Clear();
+ //if pinned objects are more than 3% remove all of them
+ if ((float)gcHandleArr.Count / (float)objectCount > 0.03f)
+ {
+ Console.WriteLine("removing all pinned objects");
+ RemoveAllPinnedObjects();
+ }
+ //Console.WriteLine("total count " + objectCount);
+ EstimatedHeapSize = objectCount * AvgObjectSize;
+ //Console.WriteLine("After removing objects: Estimated Heap size= " + EstimatedHeapSize);
+ }
+
+ public static void RemoveAllPinnedObjects()
+ {
+ for (int k = 0; k < gcHandleArr.Count; k++)
+ {
+ gcHandleArr[k].Free();
+ }
+ gcHandleArr.Clear();
+ }
+ //estimate the total number of objects in the reference graph
+ public static int CountTotalObjects(List<Object> Arr)
+ {
+ Visited.Clear();
+ Console.WriteLine("Counting Objects..");
+ //use the "visited" table
+ int runningCount = 0;
+ // runningCount += CountReferences(Arr[0]);
+ for (int i = 0; i < Arr.Count; i++)
+ {
+ runningCount+= CountReferences(Arr[i]);
+ }
+
+ for (int i = 0; i < staticArr.Count; i++)
+ {
+ runningCount += CountReferences(staticArr[i]);
+ }
+ runningCount += gcHandleArr.Count;
+
+ Console.WriteLine("Pinned GCHandles " + gcHandleArr.Count);
+
+ return runningCount;
+ }
+
+ //counts the refernces of this objects
+ public static int CountReferences( Object o)
+ {
+ if (Visited.Contains(o))
+ {
+ return 0;
+ }
+ else
+ Visited.Add(o);
+ int count = 1;
+
+ Object[] oArr = o as Object[];
+ if (oArr == null)
+ return count;
+ for (int i = 0; i < oArr.Length; i++)
+ {
+ if (oArr[i] != null)
+ {
+ count += CountReferences(oArr[i]);
+ }
+ }
+
+ return count;
+ }
+ public static void CleanupWeakReferenceArr()
+ {
+ for (int k = weakList.Count - 1; k >= 0; k--)
+ {
+ if (weakList[k] == null || !(weakList[k].IsAllocated))
+ {
+ weakList.RemoveAt(k);
+ }
+ else if (weakList[k].Target == null)
+ {
+ weakList[k].Free();
+ weakList.RemoveAt(k);
+ }
+ }
+ }
+ public static int AllocateRegion(int regionSize, float pinnedPercentage, int minSpace, int maxSpace, int minObject, int maxObject, List<Object> Arr)
+ {
+ int sizeCounter = 0;
+ double pinnedCount = 0;
+ double objectCount = 0;
+ Object o;
+
+ Region r = new Region();
+ regionList.Add(r);
+ while (sizeCounter < regionSize)
+ {
+ byte[] Temp = new byte[Rand.Next(50, 200)];
+ int objSize = Rand.Next(minObject, maxObject); //Console.WriteLine("Objsize " + objSize);
+ if ((pinnedCount * 100.0 / objectCount) < pinnedPercentage)
+ {
+ AddPinnedObject(objSize);
+ pinnedCount++;
+ }
+ else
+ {
+ o = AddObject(objSize, Arr);
+ r.Objects.Add(o);
+ }
+
+ int spaceSize = Rand.Next(minSpace, maxSpace);
+ r.Spaces.Add(new byte[spaceSize]);
+ sizeCounter += objSize;
+ sizeCounter += spaceSize;
+ objectCount++;
+ EstimatedObjectCount ++;
+ EstimatedHeapSize += objSize;
+
+ }
+ //Console.WriteLine("Pinned objects in region: " + pinnedCount);
+ // Console.WriteLine("Allocated {0} objects per this region", objectCount);
+ // Console.WriteLine("Allocated {0} bytes per this region including spaces", sizeCounter);
+ UpdateAvg();
+ return sizeCounter;
+ }
+
+ public static void UpdateAvg()
+ {
+ AvgObjectSize = (double)EstimatedHeapSize / (double)EstimatedObjectCount;
+ //Console.WriteLine("Avg object size " + AvgObjectSize);
+ }
+ public static void AddPinnedObject(int objSize)
+ {
+ gcHandleArr.Add(GCHandle.Alloc(CreateObject(objSize, true), GCHandleType.Pinned));
+ }
+
+ public static void AddRef(Object from, Object to)
+ {
+ Object[] arrFrom = from as Object[];
+ for (int i = 0; i < arrFrom.Length; i++)
+ {
+ if (arrFrom[i] == null)
+ {
+ arrFrom[i] = to;
+ break;
+ }
+ }
+
+ }
+
+ //add ref from this object to existing objects
+ public static void AddRefFrom(Object from)
+ {
+ int pos = Rand.Next(0, weakList.Count);
+ bool found = false;
+ while (!found)
+ {
+ pos = Rand.Next(0, weakList.Count);
+ if (weakList[pos] == null || !weakList[pos].IsAllocated)
+ continue;
+ if (weakList[pos].Target != null)
+ {
+ AddRef(from, weakList[pos].Target);
+ found = true;
+ }
+ }
+ }
+
+ //add ref from this object to existing objects
+ public static void AddRefTo(Object to)
+ {
+ int pos = Rand.Next(0, weakList.Count);
+ bool found = false;
+ while (!found)
+ {
+ pos = Rand.Next(0, weakList.Count);
+ if (weakList[pos] == null || !weakList[pos].IsAllocated)
+ continue;
+ if (weakList[pos].Target != null)
+ {
+ AddRef(weakList[pos].Target, to);
+ found = true;
+ }
+ }
+ }
+
+ //add as reference to existing objects
+ public static Object AddObject(int size, List<Object> Arr)
+ {
+ bool found = false;
+ Object[] o = new Object[size / pointerSize];
+ int r = Rand.Next(0, 10);
+ if (r == 0)
+ {
+ staticArr.Add(o);
+ //add ref from this object to existing objects
+ AddRefFrom(o);
+ }
+ else if (r == 1)
+ {
+ Arr.Add(o);
+ AddRefFrom(o);
+ }
+ else
+ {
+ //add as reference to existing objects
+ AddRefTo(o);
+
+ }
+
+ //find an empty place in array
+ found = false;
+ for (int i = 0; i < weakList.Count; i++)
+ {
+ if (weakList[i] == null || !weakList[i].IsAllocated)
+ {
+ weakList[i] = GCHandle.Alloc(o, GCHandleType.Weak);
+ found = true;
+ }
+ }
+ if(!found)
+ weakList.Add(GCHandle.Alloc(o, GCHandleType.Weak));
+ return o;
+ }
+
+ public static void AddEphemeralObject(int size)
+ {
+ for(int i=0; i<ephemeralList.Length; i++)
+ {
+ if(ephemeralList[i]==null || (GC.GetGeneration(ephemeralList[i])>=1))
+ {
+ ephemeralList[i] = new byte[size];
+ break;
+ }
+
+ }
+ }
+
+ public static void RunTest(List<Object> Arr)
+ {
+ System.Diagnostics.Stopwatch threadStopwatch = new System.Diagnostics.Stopwatch();
+ threadStopwatch.Start();
+
+
+
+ //Steady state: objects die and others are created
+
+ int iter = 0;
+ while (true)
+ {
+ Console.WriteLine("Iteration# " + iter);
+ int randnumber = Rand.Next(0, 30);
+ if (randnumber == 1)
+ {
+ Console.WriteLine("Setting LOH compaction mode");
+ GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
+ }
+ int randnumber2 = Rand.Next(0, 30);
+ if (randnumber2 == 1)
+ {
+ Console.WriteLine("GC.Collect");
+ GC.Collect();
+ }
+
+ Console.WriteLine("Allocating phase. Start at {0}", DateTime.Now);
+ if(iter==0)
+ InitialAllocation(Arr);
+ else
+ AllocatingPhase(Arr, 20);
+
+ if (randnumber == 2)
+ {
+ Console.WriteLine("Setting LOH compaction mode");
+ GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
+ }
+ if (randnumber2 == 2)
+ {
+ Console.WriteLine("GC.Collect");
+ GC.Collect();
+ }
+ Console.WriteLine("starting steady state. Time is {0}", DateTime.Now);
+ SteadyState(Arr);
+ Console.WriteLine("End steady state. Time is {0}", DateTime.Now);
+ if (randnumber == 3)
+ {
+ Console.WriteLine("Setting LOH compaction mode");
+ GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
+ }
+ if (randnumber2 == 3)
+ {
+ Console.WriteLine("GC.Collect");
+ GC.Collect();
+ }
+ iter++;
+
+ if (timeBased)
+ {
+ if (threadStopwatch.ElapsedMilliseconds / 1000 > timeout)
+ break;
+ }
+ else //not timebased
+ {
+ if(iter>=countIters)
+ break;
+ }
+ }
+
+ }
+
+
+
+ public static void InitializeSizeBuckets()
+ {
+ sizeBuckets[0] = new SizeBucket(BUCKET1_MIN, BUCKET2_MIN);
+ sizeBuckets[1] = new SizeBucket(BUCKET2_MIN, BUCKET3_MIN);
+ sizeBuckets[2] = new SizeBucket(BUCKET3_MIN, BUCKET4_MIN);
+ sizeBuckets[3] = new SizeBucket(BUCKET4_MIN, BUCKETS_MAX);
+ }
+ /// Parse the arguments and also initialize values that are not set by args
+ public static bool ParseArgs(string[] args)
+ {
+ randomSeed = (int)DateTime.Now.Ticks;
+
+ try
+ {
+ for (int i = 0; i < args.Length; ++i)
+ {
+ string currentArg = args[i]; //Console.WriteLine(currentArg);
+ string currentArgValue;
+ if (currentArg.StartsWith("-") || currentArg.StartsWith("/"))
+ {
+ currentArg = currentArg.Substring(1);
+ }
+ else
+ {
+ Console.WriteLine("Error! Unexpected argument {0}", currentArg);
+ return false;
+ }
+
+ if (currentArg.StartsWith("?"))
+ {
+ Usage();
+ return false;
+ }
+ else if (String.Compare(currentArg.ToLower(), "iter") == 0) // number of iterations
+ {
+ currentArgValue = args[++i];
+ countIters = Int32.Parse(currentArgValue);
+ timeBased = false;
+ }
+ else if (String.Compare(currentArg.ToLower(), "maxheapmb") == 0)
+ {
+ currentArgValue = args[++i];
+ maxHeapMB = Int32.Parse(currentArgValue);
+ }
+ else if (String.Compare(currentArg.ToLower(), "regionsizemb") == 0)
+ {
+ currentArgValue = args[++i];
+ regionSizeMB = Int32.Parse(currentArgValue);
+ }
+ else if (String.Compare(currentArg.ToLower(), "timeout") == 0) //seconds; if 0 run forever
+ {
+ currentArgValue = args[++i];
+ timeout = Int64.Parse(currentArgValue);
+ if (timeout == -1)
+ {
+ timeout = Int64.MaxValue;
+ }
+ }
+ else if (String.Compare(currentArg.ToLower(), "randomseed") == 0) // number of iterations
+ {
+ currentArgValue = args[++i];
+ randomSeed = Int32.Parse(currentArgValue);
+ }
+ else
+ {
+ Console.WriteLine("Error! Unexpected argument {0}", currentArg);
+ return false;
+ }
+
+ }
+ }
+ catch (System.Exception e)
+ {
+ Console.WriteLine("Incorrect arguments");
+ Console.WriteLine(e.ToString());
+ return false;
+ }
+
+ //do some basic checking of the arguments
+ if (countIters < 1 )
+ {
+ Console.WriteLine("Incorrect values for arguments");
+ return false;
+ }
+ InitializeSizeBuckets();
+
+ Console.WriteLine("Repro with: ");
+ Console.WriteLine("==============================");
+ if(timeBased)
+ Console.WriteLine("-timeout " + timeout);
+ else
+ Console.WriteLine("-iter " + countIters);
+ Console.WriteLine("-maxHeapMB " + maxHeapMB);
+ Console.WriteLine("-regionSizeMB " + regionSizeMB);
+ Console.WriteLine("-randomseed " + randomSeed);
+ Console.WriteLine("==============================");
+ return true;
+ }
+
+
+ public static void Usage()
+ {
+ Console.WriteLine("PartialCompactionTest [options]");
+ Console.WriteLine("\nOptions");
+ Console.WriteLine("-? Display the usage and exit");
+ Console.WriteLine("-iter <num iterations> : specify number of iterations for the test, default is " + countIters);
+ Console.WriteLine("If using time based instead of iterations:");
+ Console.WriteLine("-timeout <seconds> : when to stop the test, default is " + timeout);
+ Console.WriteLine("-maxHeapMB <MB> : max heap size in MB to allocate, default is " + maxHeapMB);
+ Console.WriteLine("-regionSizeMB <MB> : regionSize, default is " + regionSizeMB);
+
+ Console.WriteLine("-randomseed <seed> : random seed(for repro)");
+ }
+
+ public class Region
+ {
+ public List<Object> Spaces = new List<Object>(2500);
+ public List<Object> Objects = new List<Object>(2500);
+ public List<Object> Ephemeral = new List<Object>(2500);
+ public void ReferenceEphemeralObjects()
+ {
+ //create refs from ephemeral objects to gen2 objects
+ if (GC.GetGeneration(Objects[0]) == 2)
+ {
+ int size = Rand.Next(30, 20000);
+ Object[] eph = new Object[size];
+ Ephemeral.Add(eph);
+ AddRef(eph, Objects[Rand.Next(0, Objects.Count)]);
+ }
+ Objects.Clear();
+ }
+ }
+
+ }
+}
diff --git a/tests/src/GC/Features/PartialCompaction/partialcompactionwloh.csproj b/tests/src/GC/Features/PartialCompaction/partialcompactionwloh.csproj
new file mode 100644
index 0000000000..905da65e56
--- /dev/null
+++ b/tests/src/GC/Features/PartialCompaction/partialcompactionwloh.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="PartialCompactionwLOH.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/Pinning/PinningOther/GCUtil_Pinning.csproj b/tests/src/GC/Features/Pinning/PinningOther/GCUtil_Pinning.csproj
index 34a16ebd72..c37c71b91e 100644
--- a/tests/src/GC/Features/Pinning/PinningOther/GCUtil_Pinning.csproj
+++ b/tests/src/GC/Features/Pinning/PinningOther/GCUtil_Pinning.csproj
@@ -32,8 +32,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Features/Pinning/PinningOther/PinnedCollect.csproj b/tests/src/GC/Features/Pinning/PinningOther/PinnedCollect.csproj
index 0f12466ab7..db3a484ba4 100644
--- a/tests/src/GC/Features/Pinning/PinningOther/PinnedCollect.csproj
+++ b/tests/src/GC/Features/Pinning/PinningOther/PinnedCollect.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Features/Pinning/PinningOther/PinnedHandle.csproj b/tests/src/GC/Features/Pinning/PinningOther/PinnedHandle.csproj
index 160b34f436..4f19b11232 100644
--- a/tests/src/GC/Features/Pinning/PinningOther/PinnedHandle.csproj
+++ b/tests/src/GC/Features/Pinning/PinningOther/PinnedHandle.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Features/Pinning/PinningOther/PinnedInt.csproj b/tests/src/GC/Features/Pinning/PinningOther/PinnedInt.csproj
index 914c084fb9..56fd7261cd 100644
--- a/tests/src/GC/Features/Pinning/PinningOther/PinnedInt.csproj
+++ b/tests/src/GC/Features/Pinning/PinningOther/PinnedInt.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Features/Pinning/PinningOther/PinnedMany.csproj b/tests/src/GC/Features/Pinning/PinningOther/PinnedMany.csproj
index 478b32ab7b..0e8097fec6 100644
--- a/tests/src/GC/Features/Pinning/PinningOther/PinnedMany.csproj
+++ b/tests/src/GC/Features/Pinning/PinningOther/PinnedMany.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Features/Pinning/PinningOther/PinnedMultiple.csproj b/tests/src/GC/Features/Pinning/PinningOther/PinnedMultiple.csproj
index 5822008e94..03a5ff1bf5 100644
--- a/tests/src/GC/Features/Pinning/PinningOther/PinnedMultiple.csproj
+++ b/tests/src/GC/Features/Pinning/PinningOther/PinnedMultiple.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Features/Pinning/PinningOther/PinnedObject.csproj b/tests/src/GC/Features/Pinning/PinningOther/PinnedObject.csproj
index 9d5c7cdc36..96969402e5 100644
--- a/tests/src/GC/Features/Pinning/PinningOther/PinnedObject.csproj
+++ b/tests/src/GC/Features/Pinning/PinningOther/PinnedObject.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Features/Pinning/PinningOther/project.json b/tests/src/GC/Features/Pinning/PinningOther/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Features/Pinning/PinningOther/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Features/SustainedLowLatency/app.config b/tests/src/GC/Features/SustainedLowLatency/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Features/SustainedLowLatency/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Features/SustainedLowLatency/scenario.cs b/tests/src/GC/Features/SustainedLowLatency/scenario.cs
new file mode 100644
index 0000000000..9725b97a6f
--- /dev/null
+++ b/tests/src/GC/Features/SustainedLowLatency/scenario.cs
@@ -0,0 +1,115 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//This is modeled after a server executing requests
+//which pin some of their newly allocated objects.
+using System;
+using System.Runtime.InteropServices;
+using System.Diagnostics;
+using System.Threading;
+using System.Runtime;
+
+class request
+{
+ Object[] survivors;
+ GCHandle pin;
+ static Random r = new Random(1234);
+ public request(int alloc_volume, float surv_fraction)
+ {
+ survivors = new Object[1 + (int)(alloc_volume * surv_fraction) / 1000];
+ int i = 0;
+ int volume = 0;
+ //allocate half of the request size.
+ while (volume < alloc_volume / 2)
+ {
+ int alloc_surv = r.Next(1000, 2000 + 2 * i);
+
+ int alloc = (int)(alloc_surv / surv_fraction) - alloc_surv;
+
+ int j = 0;
+ while (j < alloc)
+ {
+ int s = r.Next(100, 200 + 2 * j);
+
+ Object x = new byte[s];
+ j += s;
+ }
+ survivors[i] = new byte[alloc_surv];
+ i++;
+ volume += alloc_surv + alloc;
+ }
+ //allocate one pinned buffer
+ pin = GCHandle.Alloc (new byte [100], GCHandleType.Pinned);
+ //allocate the rest of the request
+ while (volume < alloc_volume)
+ {
+ int alloc_surv = r.Next(1000, 2000 + 2 * i);
+ int alloc = (int)(alloc_surv / surv_fraction) - alloc_surv;
+ int j = 0;
+ while (j < alloc)
+ {
+ int s = r.Next(100, 200 + 2 * j);
+
+ Object x = new byte[s];
+ j += s;
+ }
+ survivors[i] = new byte[alloc_surv];
+ i++;
+ volume += alloc_surv + alloc;
+ }
+
+ }
+ public void retire()
+ {
+ pin.Free();
+ }
+
+ static public void Main(String[] args)
+ {
+ int n_requests = 600;
+ int allocation_volume = 100000; // 1 mil
+ float survival_rate = 0.6f;
+ request[] requests = new request[n_requests];
+ int loop = 0;
+ Stopwatch stopwatch = new Stopwatch();
+ stopwatch.Start();
+ double total_elapsed_ms = 0;
+
+ //loop for about 3 min
+ while (total_elapsed_ms < 3 * 60 * 1000)
+ {
+ for (loop = 0; loop < (n_requests * 100); loop++)
+ {
+ int i = r.Next(0, n_requests);
+ if (requests[i] != null)
+ {
+ requests[i].retire();
+ }
+ requests[i] = new request(allocation_volume, survival_rate);
+
+ }
+
+ Console.Write(" Cleaning up-------");
+ Console.WriteLine("gen0: {0}, gen1: {1}; gen2: {2}, heap size: {3:N0} bytes",
+ GC.CollectionCount(0),
+ GC.CollectionCount(1),
+ GC.CollectionCount(2),
+ GC.GetTotalMemory(false));
+
+
+ for (loop = 0; loop < n_requests; loop++)
+ {
+ if (requests[loop] != null)
+ {
+ requests[loop].retire();
+ requests[loop] = null;
+ }
+ }
+
+ total_elapsed_ms = stopwatch.Elapsed.TotalMilliseconds;
+ }
+ }
+}
+
+
diff --git a/tests/src/GC/Features/SustainedLowLatency/scenario.csproj b/tests/src/GC/Features/SustainedLowLatency/scenario.csproj
new file mode 100644
index 0000000000..028c7803dd
--- /dev/null
+++ b/tests/src/GC/Features/SustainedLowLatency/scenario.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="Scenario.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race.cs b/tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race.cs
new file mode 100644
index 0000000000..20c3bf610f
--- /dev/null
+++ b/tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race.cs
@@ -0,0 +1,150 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Runtime;
+
+namespace SustainedLowLatencyTest
+{
+ class SLL
+ {
+ //The test tries to set SustainedLowLatency when a foreground GC is in progress
+ //Regression test for Bug 576224: Race condition using GCSettings.LatencyMode
+ static volatile bool setSSLdone = false;
+ static Int64 iterations = 2000;
+ static bool runForever = false;
+ static bool failed = false;
+
+ static int Main(string[] args)
+ {
+ if (args.Length > 0)
+ iterations = Int64.Parse(args[0]);
+
+ if (iterations == -1)
+ runForever = true;
+ if (runForever)
+ Console.WriteLine("Run until fail");
+ else
+ Console.WriteLine("Run {0} iterations", iterations);
+ Thread t1 = new Thread(SetSLL);
+ Thread t2 = new Thread(Allocate);
+ int numThreads = 100;
+ Thread[] threadArr = new Thread[numThreads];
+ for (int i = 0; i < numThreads; i++)
+ {
+ threadArr[i] = new Thread(AllocateTempObjects);
+ threadArr[i].Start();
+ }
+
+ t1.Start();
+ t2.Start();
+
+ t1.Join();
+ t2.Join();
+ for (int i = 0; i < numThreads; i++)
+ {
+ threadArr[i].Join();
+ }
+
+ if (failed)
+ {
+ Console.WriteLine("Test failed");
+ return 1;
+ }
+ Console.WriteLine("Test passed");
+ return 100;
+
+ }
+
+ public static void SetSLL(object threadInfoObj)
+ {
+ System.Threading.Thread.Sleep(200);
+ GCLatencyMode initialMode = GCSettings.LatencyMode;
+ Console.WriteLine("Initial mode is: " + initialMode);
+
+ Int64 counter = 0;
+ while (!failed &&(runForever || counter<iterations))
+ {
+ counter++;
+ GC.Collect(2, GCCollectionMode.Optimized, false);
+
+ for (int j = 0; j < 100; j++)
+ {
+ GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
+
+ GCLatencyMode lm = GCSettings.LatencyMode;
+ // Console.WriteLine(lm);
+ if (lm != GCLatencyMode.SustainedLowLatency)
+ {
+ Console.WriteLine("latency mode is {0}; expected GCLatencyMode.SustainedLowLatency", lm);
+ failed = true;
+ break;
+ }
+ GCSettings.LatencyMode = initialMode;
+ GCLatencyMode lmOrig = GCSettings.LatencyMode;
+ if (lmOrig != initialMode)
+ {
+ Console.WriteLine("latency mode is {0}; expected {1}", lmOrig, initialMode);
+ failed = true;
+ break;
+ }
+ }
+
+ Thread.Sleep(100);
+ }
+ setSSLdone = true;
+ }
+
+
+ public static void AllocateTempObjects(object threadInfoObj)
+ {
+ int listSize2 = 1000;
+ List<byte[]> tempList = new List<byte[]>();
+ while (!setSSLdone)
+ {
+ byte[] temp = new byte[20];
+ for (int i = 0; i < listSize2; i++)
+ {
+ tempList.Add(new byte[50]);
+ }
+ tempList.Clear();
+ }
+
+ }
+
+ public static void Allocate(object threadInfoObj)
+ {
+ int ListSize = 300;
+ System.Random rnd = new Random(1122);
+
+ int listSize2 = 1000;
+ List<byte[]> newList = new List<byte[]>(500+1000);
+
+
+ while (!setSSLdone)
+ {
+ for (int i = 0; i < ListSize; i++)
+ {
+ newList.Add(new byte[85000]);
+ newList.Add(new byte[200]);
+ Thread.Sleep(10);
+ }
+ for (int i = 0; i < listSize2; i++)
+ {
+ newList.Add(new byte[50]);
+ }
+ newList.Clear();
+ }
+ }
+
+
+}
+
+
+
+}
diff --git a/tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race.csproj b/tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race.csproj
new file mode 100644
index 0000000000..7048a0cbf2
--- /dev/null
+++ b/tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="SustainedLowLatency_Race.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race_reverse.cs b/tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race_reverse.cs
new file mode 100644
index 0000000000..a21c3715c9
--- /dev/null
+++ b/tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race_reverse.cs
@@ -0,0 +1,159 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Runtime;
+
+namespace SustainedLowLatencyTest
+{
+ class SLL
+ {
+ //The test tries to unset SustainedLowLatency when a foreground GC is in progress
+ //Regression test for Bug 576224: Race condition using GCSettings.LatencyMode
+ static volatile bool setSSLdone = false;
+ static Int64 iterations = 2000;
+ static bool runForever = false;
+ static bool failed = false;
+ static GCLatencyMode initialMode;
+
+ static int Main(string[] args)
+ {
+ if (args.Length > 0)
+ iterations = Int64.Parse(args[0]);
+
+ if (iterations == -1)
+ runForever = true;
+ if (runForever)
+ Console.WriteLine("Run until fail");
+ else
+ Console.WriteLine("Run {0} iterations", iterations);
+
+ initialMode = GCSettings.LatencyMode;
+ Console.WriteLine("Initial mode is: " + initialMode);
+ GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
+
+ Thread t1 = new Thread(SetSLL);
+ Thread t2 = new Thread(Allocate);
+ int numThreads = 100;
+ Thread[] threadArr = new Thread[numThreads];
+ for (int i = 0; i < numThreads; i++)
+ {
+ threadArr[i] = new Thread(AllocateTempObjects);
+ threadArr[i].Start();
+ }
+
+ t1.Start();
+ t2.Start();
+
+ t1.Join();
+ t2.Join();
+ for (int i = 0; i < numThreads; i++)
+ {
+ threadArr[i].Join();
+ }
+
+ if (failed)
+ {
+ Console.WriteLine("Test failed");
+ return 1;
+ }
+ Console.WriteLine("Test passed");
+ return 100;
+
+ }
+
+ public static void SetSLL(object threadInfoObj)
+ {
+ System.Threading.Thread.Sleep(50);
+
+ Int64 counter = 0;
+ while (!failed &&(runForever || counter<iterations))
+ {
+ counter++;
+ GC.Collect(2, GCCollectionMode.Optimized, false);
+
+ for (int j = 0; j < 100; j++)
+ {
+
+ GCSettings.LatencyMode = initialMode;
+ GCLatencyMode lmOrig = GCSettings.LatencyMode;
+ if (lmOrig != initialMode)
+ {
+ Console.WriteLine("latency mode is {0}; expected {1}", lmOrig, initialMode);
+ failed = true;
+ break;
+ }
+ GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency; ;
+
+ GCLatencyMode lm = GCSettings.LatencyMode;
+ // Console.WriteLine(lm);
+ if (lm != GCLatencyMode.SustainedLowLatency)
+ {
+ Console.WriteLine("latency mode is {0}; expected GCLatencyMode.SustainedLowLatency", lm);
+ failed = true;
+ break;
+ }
+ }
+
+ Thread.Sleep(100);
+ }
+ setSSLdone = true;
+ }
+
+
+ public static void AllocateTempObjects(object threadInfoObj)
+ {
+ int listSize2 = 1000;
+ List<byte[]> tempList = new List<byte[]>();
+ while (!setSSLdone)
+ {
+ byte[] temp = new byte[20];
+ for (int i = 0; i < listSize2; i++)
+ {
+ tempList.Add(new byte[50]);
+ }
+ tempList.Clear();
+ }
+
+ }
+
+ public static void Allocate(object threadInfoObj)
+ {
+ int ListSize = 300;
+ System.Random rnd = new Random(1122);
+
+ int listSize2 = 1000;
+ List<byte[]> newList = new List<byte[]>(500+1000);
+
+
+ while (!setSSLdone)
+ {
+ for (int i = 0; i < ListSize; i++)
+ {
+ newList.Add(new byte[85000]);
+ newList.Add(new byte[200]);
+ Thread.Sleep(10);
+ }
+ for (int i = 0; i < listSize2; i++)
+ {
+ newList.Add(new byte[50]);
+ }
+ newList.Clear();
+ }
+
+
+
+
+ }
+
+
+}
+
+
+
+}
diff --git a/tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race_reverse.csproj b/tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race_reverse.csproj
new file mode 100644
index 0000000000..868ee9c689
--- /dev/null
+++ b/tests/src/GC/Features/SustainedLowLatency/sustainedlowlatency_race_reverse.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="SustainedLowLatency_Race_Reverse.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/LargeMemory/API/gc/app.config b/tests/src/GC/LargeMemory/API/gc/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/LargeMemory/API/gc/collect.cs b/tests/src/GC/LargeMemory/API/gc/collect.cs
new file mode 100644
index 0000000000..f39bebb90e
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/collect.cs
@@ -0,0 +1,82 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+public sealed class CollectTest {
+
+ private int numTests = 0;
+ public uint size = 0;
+
+ private bool collectLargeObject(int gen) {
+ numTests++;
+ LargeObject lo;
+ try {
+ lo = new LargeObject(size, true);
+ } catch (OutOfMemoryException) {
+ Console.WriteLine("Large Memory Machine required");
+ return false;
+ } catch (Exception e) {
+ Console.WriteLine("Unexpected Exception:");
+ Console.WriteLine(e);
+ return false;
+ }
+ lo = null;
+ GC.Collect(gen);
+ GC.WaitForPendingFinalizers();
+ GC.Collect(gen);
+
+ if (LargeObject.FinalizedCount>0) {
+ Console.WriteLine("collectLargeObject {0} passed", gen);
+ return true;
+ }
+
+ Console.WriteLine("collectLargeObject {0} failed", gen);
+ return false;
+ }
+
+ public bool RunTests() {
+ int numPassed = 0;
+
+ if (collectLargeObject(0)) {
+ numPassed++;
+ }
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ if (collectLargeObject(2)) {
+ numPassed++;
+ }
+
+
+ return (numTests==numPassed);
+ }
+
+ public static int Main(string[] args) {
+
+ uint size = 0;
+ try {
+ size = UInt32.Parse(args[0]);
+ } catch (Exception e) {
+ if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
+ Console.WriteLine("args: uint - number of GB to allocate");
+ return 0;
+ }
+ throw;
+ }
+
+ CollectTest test = new CollectTest();
+ test.size = size;
+
+ if (test.RunTests()) {
+ Console.WriteLine("Test passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test failed");
+ return 0;
+ }
+}
diff --git a/tests/src/GC/LargeMemory/API/gc/collect.csproj b/tests/src/GC/LargeMemory/API/gc/collect.csproj
new file mode 100644
index 0000000000..e097224e37
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/collect.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="Collect.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="LargeObject.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/LargeMemory/API/gc/getgeneration.cs b/tests/src/GC/LargeMemory/API/gc/getgeneration.cs
new file mode 100644
index 0000000000..950b24eea3
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/getgeneration.cs
@@ -0,0 +1,105 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+
+public sealed class GetGenerationTest {
+
+ public uint size = 0;
+ private int numTests=0;
+
+ private bool getGenerationWR() {
+ numTests++;
+ int gen = -1;
+
+ try {
+ gen = GC.GetGeneration(new WeakReference(new LargeObject(size)));
+ } catch (OutOfMemoryException) {
+ Console.WriteLine("Large Memory Machine required");
+ return false;
+ } catch (Exception e) {
+ Console.WriteLine("Unexpected Exception:");
+ Console.WriteLine(e);
+ return false;
+ }
+
+ if (gen==GC.MaxGeneration) {
+ Console.WriteLine("getGenerationWR passed");
+ return true;
+ }
+
+ Console.WriteLine(gen);
+ Console.WriteLine("getGenerationWR failed");
+ return false;
+ }
+
+ private bool getGeneration() {
+ numTests++;
+
+ int gen = -1;
+
+ try {
+ LargeObject lo = new LargeObject(size);
+ gen = GC.GetGeneration(lo);
+
+ } catch (OutOfMemoryException) {
+ Console.WriteLine("Large Memory Machine required");
+ return false;
+ } catch (Exception e) {
+ Console.WriteLine("Unexpected Exception:");
+ Console.WriteLine(e);
+ return false;
+ }
+
+ if (gen==GC.MaxGeneration) {
+ Console.WriteLine("getGeneration passed");
+ return true;
+ }
+
+ Console.WriteLine(gen);
+ Console.WriteLine("getGeneration failed");
+ return false;
+ }
+
+ public bool RunTests() {
+ int numPassed = 0;
+
+ if (getGeneration()) {
+ numPassed++;
+ }
+
+ if (getGenerationWR()) {
+ numPassed++;
+ }
+
+
+ return (numPassed==numTests);
+ }
+
+
+ public static int Main(string[] args) {
+
+ uint size = 0;
+ try {
+ size = UInt32.Parse(args[0]);
+ } catch (Exception e) {
+ if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
+ Console.WriteLine("args: uint - number of GB to allocate");
+ return 0;
+ }
+ throw;
+ }
+
+ GetGenerationTest test = new GetGenerationTest();
+ test.size = size;
+ if (test.RunTests()) {
+ Console.WriteLine("Test passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test failed");
+ return 0;
+ }
+}
diff --git a/tests/src/GC/LargeMemory/API/gc/getgeneration.csproj b/tests/src/GC/LargeMemory/API/gc/getgeneration.csproj
new file mode 100644
index 0000000000..77b3c63b1a
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/getgeneration.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="GetGeneration.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="LargeObject.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/LargeMemory/API/gc/gettotalmemory.cs b/tests/src/GC/LargeMemory/API/gc/gettotalmemory.cs
new file mode 100644
index 0000000000..8d4eb44e50
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/gettotalmemory.cs
@@ -0,0 +1,64 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+public sealed class GetTotalMemoryTest {
+ private uint size = 0;
+ public GetTotalMemoryTest(uint size) {
+ this.size = size;
+ }
+
+
+ public bool RunTests() {
+
+ try {
+ LargeObject lo = new LargeObject(size);
+ long mem = GC.GetTotalMemory(false);
+ long delta = (long)(size*LargeObject.GB)/(long)10;
+
+ if ( (mem - size*LargeObject.GB)> delta) {
+ Console.WriteLine("{0} {1} {2}", mem, size*LargeObject.GB, delta);
+ return false;
+ }
+
+ GC.KeepAlive(lo);
+
+ } catch (OutOfMemoryException) {
+ Console.WriteLine("Large Memory Machine required");
+ return false;
+ } catch (Exception e) {
+ Console.WriteLine("Unexpected Exception:");
+ Console.WriteLine(e);
+ return false;
+ }
+
+ return true;
+
+ }
+
+ public static int Main(string[] args) {
+
+ uint size = 0;
+ try {
+ size = UInt32.Parse(args[0]);
+ } catch (Exception e) {
+ if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
+ Console.WriteLine("args: uint - number of GB to allocate");
+ return 0;
+ }
+ throw;
+ }
+
+
+ GetTotalMemoryTest test = new GetTotalMemoryTest(size);
+ if (test.RunTests()) {
+ Console.WriteLine("Test passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test failed");
+ return 0;
+ }
+}
diff --git a/tests/src/GC/LargeMemory/API/gc/gettotalmemory.csproj b/tests/src/GC/LargeMemory/API/gc/gettotalmemory.csproj
new file mode 100644
index 0000000000..e3bd5d20ea
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/gettotalmemory.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="GetTotalMemory.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="LargeObject.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/LargeMemory/API/gc/keepalive.cs b/tests/src/GC/LargeMemory/API/gc/keepalive.cs
new file mode 100644
index 0000000000..a7bcd93d5a
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/keepalive.cs
@@ -0,0 +1,65 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+public sealed class KeepAliveTest {
+
+ private uint size = 0;
+
+ public KeepAliveTest(uint size) {
+ this.size = size;
+ }
+
+ public bool RunTests() {
+
+ try {
+ LargeObject lo = new LargeObject(size);
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ if (lo == null)
+ return false;
+ GC.KeepAlive(lo);
+
+ } catch (OutOfMemoryException) {
+ Console.WriteLine("Large Memory Machine required");
+ return false;
+ } catch (Exception e) {
+ Console.WriteLine("Unexpected Exception:");
+ Console.WriteLine(e);
+ return false;
+ }
+
+ return true;
+ }
+
+
+ public static int Main(string[] args) {
+
+ uint size = 0;
+ try {
+ size = UInt32.Parse(args[0]);
+ } catch (Exception e) {
+ if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
+ Console.WriteLine("args: uint - number of GB to allocate");
+ return 0;
+ }
+ throw;
+ }
+
+
+ KeepAliveTest test = new KeepAliveTest(size);
+
+ if (test.RunTests()) {
+ Console.WriteLine("Test passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test failed");
+ return 0;
+ }
+}
diff --git a/tests/src/GC/LargeMemory/API/gc/keepalive.csproj b/tests/src/GC/LargeMemory/API/gc/keepalive.csproj
new file mode 100644
index 0000000000..afcdaa2ee1
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/keepalive.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="KeepAlive.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="LargeObject.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/LargeMemory/API/gc/largeobject.cs b/tests/src/GC/LargeMemory/API/gc/largeobject.cs
new file mode 100644
index 0000000000..6d7bef35a0
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/largeobject.cs
@@ -0,0 +1,50 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+//[Serializable()]
+public sealed class LargeObject {
+
+ private byte[][] data;
+ private uint sizeInGB;
+ private LargeObject next;
+ public static int FinalizedCount = 0;
+
+ public const long GB = 1024*1024*1024;
+
+ public LargeObject(uint sizeInGB):this(sizeInGB, false)
+ {
+ }
+
+ public LargeObject(uint sizeInGB, bool finalize) {
+ this.sizeInGB = sizeInGB;
+
+ if (!finalize) {
+ GC.SuppressFinalize(this);
+ }
+
+ data = new byte[sizeInGB][];
+ for (int i=0; i<sizeInGB; i++) {
+ data[i] = new byte[GB];
+ }
+ }
+
+ ~LargeObject() {
+ Console.WriteLine("Finalized");
+ FinalizedCount++;
+ }
+
+ public long Size {
+ get {
+ return sizeInGB*GB;
+ }
+ }
+
+ public LargeObject Next {
+ get { return next; }
+ set { next = value; }
+ }
+
+}
diff --git a/tests/src/GC/LargeMemory/API/gc/largeobject.csproj b/tests/src/GC/LargeMemory/API/gc/largeobject.csproj
new file mode 100644
index 0000000000..519a2816bf
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/largeobject.csproj
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestKind>BuildOnly</CLRTestKind>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LargeObject.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/LargeMemory/API/gc/reregisterforfinalize.cs b/tests/src/GC/LargeMemory/API/gc/reregisterforfinalize.cs
new file mode 100644
index 0000000000..8690ee982e
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/reregisterforfinalize.cs
@@ -0,0 +1,62 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+public sealed class ReRegisterForFinalizeTest {
+
+ private uint size = 0;
+
+ public ReRegisterForFinalizeTest(uint size ) {
+ this.size = size;
+ }
+
+
+ public bool RunTests() {
+
+ LargeObject lo;
+ try {
+ lo = new LargeObject(size, true);
+ GC.ReRegisterForFinalize(lo);
+ } catch (OutOfMemoryException) {
+ Console.WriteLine("Large Memory Machine required");
+ return false;
+ } catch (Exception e) {
+ Console.WriteLine("Unexpected Exception:");
+ Console.WriteLine(e);
+ return false;
+ }
+ lo = null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ return (LargeObject.FinalizedCount==2);
+ }
+
+ public static int Main(string[] args) {
+
+ uint size = 0;
+ try {
+ size = UInt32.Parse(args[0]);
+ } catch (Exception e) {
+ if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
+ Console.WriteLine("args: uint - number of GB to allocate");
+ return 0;
+ }
+ throw;
+ }
+
+
+ ReRegisterForFinalizeTest test = new ReRegisterForFinalizeTest(size);
+
+ if (test.RunTests()) {
+ Console.WriteLine("Test passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test failed");
+ return 0;
+ }
+}
diff --git a/tests/src/GC/LargeMemory/API/gc/reregisterforfinalize.csproj b/tests/src/GC/LargeMemory/API/gc/reregisterforfinalize.csproj
new file mode 100644
index 0000000000..28e8859e44
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/reregisterforfinalize.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="ReRegisterForFinalize.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="LargeObject.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/LargeMemory/API/gc/suppressfinalize.cs b/tests/src/GC/LargeMemory/API/gc/suppressfinalize.cs
new file mode 100644
index 0000000000..d3ec74dffa
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/suppressfinalize.cs
@@ -0,0 +1,62 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+public sealed class SuppressFinalizeTest {
+
+ private uint size = 0;
+
+ public SuppressFinalizeTest(uint size ) {
+ this.size = size;
+ }
+
+
+ public bool RunTests() {
+
+ LargeObject lo;
+ try {
+ lo = new LargeObject(size, true);
+ GC.SuppressFinalize(lo);
+ } catch (OutOfMemoryException) {
+ Console.WriteLine("Large Memory Machine required");
+ return false;
+ } catch (Exception e) {
+ Console.WriteLine("Unexpected Exception:");
+ Console.WriteLine(e);
+ return false;
+ }
+ lo = null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ return (LargeObject.FinalizedCount==0);
+ }
+
+ public static int Main(string[] args) {
+
+ uint size = 0;
+ try {
+ size = UInt32.Parse(args[0]);
+ } catch (Exception e) {
+ if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
+ Console.WriteLine("args: uint - number of GB to allocate");
+ return 0;
+ }
+ throw;
+ }
+
+
+ SuppressFinalizeTest test = new SuppressFinalizeTest(size);
+
+ if (test.RunTests()) {
+ Console.WriteLine("Test passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test failed");
+ return 0;
+ }
+}
diff --git a/tests/src/GC/LargeMemory/API/gc/suppressfinalize.csproj b/tests/src/GC/LargeMemory/API/gc/suppressfinalize.csproj
new file mode 100644
index 0000000000..c083450908
--- /dev/null
+++ b/tests/src/GC/LargeMemory/API/gc/suppressfinalize.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="SuppressFinalize.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="LargeObject.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/LargeMemory/Allocation/app.config b/tests/src/GC/LargeMemory/Allocation/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/LargeMemory/Allocation/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/LargeMemory/Allocation/finalizertest.cs b/tests/src/GC/LargeMemory/Allocation/finalizertest.cs
new file mode 100644
index 0000000000..66ac448334
--- /dev/null
+++ b/tests/src/GC/LargeMemory/Allocation/finalizertest.cs
@@ -0,0 +1,171 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+// a large object that resurrects itself
+public sealed class LargeObject2 {
+
+ private byte[][] data;
+
+ public const long GB = 1024*1024*1024;
+
+ public LargeObject2(uint sizeInGB)
+ {
+ data = new byte[sizeInGB][];
+ for (int i=0; i<sizeInGB; i++) {
+ data[i] = new byte[GB];
+ }
+
+ }
+
+ ~LargeObject2() {
+ FinalizerTest.LO2 = this;
+ }
+
+}
+
+// allocates a large object on the finalizer thread
+public sealed class FinalizerObject {
+ uint size = 0;
+
+ public FinalizerObject(uint sizeInGB)
+ {
+ size = sizeInGB;
+ }
+
+ ~FinalizerObject() {
+
+ LargeObject lo =null;
+
+ try {
+ lo = new LargeObject(size);
+ } catch (OutOfMemoryException) {
+ Console.WriteLine("OOM");
+ return;
+ } catch (Exception e) {
+ Console.WriteLine("Unexpected Exception");
+ Console.WriteLine(e);
+ return;
+ }
+
+ if (lo!=null)
+ FinalizerTest.ObjectSize = lo.Size;
+ GC.KeepAlive(lo);
+ }
+}
+
+
+public sealed class FinalizerTest {
+
+ public static LargeObject2 LO2 = null;
+ public static long ObjectSize = 0;
+
+ private uint size = 0;
+ private int numTests = 0;
+
+
+ public FinalizerTest(uint size) {
+ this.size = size;
+ }
+
+ bool ressurectionTest() {
+ numTests++;
+
+ try {
+ new LargeObject2(size);
+ } catch (OutOfMemoryException) {
+ Console.WriteLine("Large Memory Machine required");
+ return false;
+ } catch (Exception e) {
+ Console.WriteLine("Unexpected Exception");
+ Console.WriteLine(e);
+ return false;
+ }
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ if (LO2 != null) {
+ Console.WriteLine("ressurectionTest passed");
+ LO2 = null;
+ return true;
+ }
+ Console.WriteLine("ressurectionTest failed");
+ return false;
+
+ }
+
+
+ bool allocateInFinalizerTest() {
+ numTests++;
+
+ try {
+ new FinalizerObject(size);
+ } catch (OutOfMemoryException) {
+ Console.WriteLine("Large Memory Machine required");
+ return false;
+ } catch (Exception e) {
+ Console.WriteLine("Unexpected Exception");
+ Console.WriteLine(e);
+ return false;
+ }
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ if (ObjectSize == size*LargeObject.GB) {
+ Console.WriteLine("allocateInFinalizerTest passed");
+ return true;
+ }
+ Console.WriteLine("{0} {1}", ObjectSize, size*LargeObject.GB);
+ Console.WriteLine("allocateInFinalizerTest failed");
+ return false;
+
+ }
+
+ public bool RunTests() {
+
+ int numPassed = 0;
+
+ if (allocateInFinalizerTest() ) {
+ numPassed++;
+ }
+
+ if (ressurectionTest() ) {
+ numPassed++;
+ }
+
+ return (numTests==numPassed);
+ }
+
+
+ public static int Main(string[] args) {
+
+ uint size = 0;
+ try {
+ size = UInt32.Parse(args[0]);
+ } catch (Exception e) {
+ if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
+ Console.WriteLine("args: uint - number of GB to allocate");
+ return 0;
+ }
+ throw;
+ }
+
+ FinalizerTest test = new FinalizerTest(size);
+
+
+ if (test.RunTests()) {
+ Console.WriteLine("Test passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test failed");
+ return 0;
+ }
+}
+
diff --git a/tests/src/GC/LargeMemory/Allocation/finalizertest.csproj b/tests/src/GC/LargeMemory/Allocation/finalizertest.csproj
new file mode 100644
index 0000000000..328fc7f980
--- /dev/null
+++ b/tests/src/GC/LargeMemory/Allocation/finalizertest.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="FinalizerTest.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="LargeObject.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/LargeMemory/Allocation/largeexceptiontest.cs b/tests/src/GC/LargeMemory/Allocation/largeexceptiontest.cs
new file mode 100644
index 0000000000..9bb926c076
--- /dev/null
+++ b/tests/src/GC/LargeMemory/Allocation/largeexceptiontest.cs
@@ -0,0 +1,69 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+public sealed class LargeException : Exception
+{
+// disabling unused variable warning
+#pragma warning disable 0414
+ LargeObject lo;
+#pragma warning restore 0414
+
+ public LargeException(uint size) {
+ lo = new LargeObject(size);
+ }
+}
+
+
+public sealed class LargeExceptionTest {
+
+ private uint size = 0;
+ public LargeExceptionTest(uint size) {
+ this.size = size;
+ }
+
+ public bool RunTests() {
+
+ try {
+ throw new LargeException(size);
+ } catch (OutOfMemoryException) {
+ Console.WriteLine("Large Memory Machine required");
+ return false;
+ } catch (LargeException) {
+ return true;
+ } catch (Exception e) {
+ Console.WriteLine("Unexpected Exception");
+ Console.WriteLine(e);
+ return false;
+ }
+
+ }
+
+ public static int Main(string[] args) {
+
+ uint size = 0;
+ try {
+ size = UInt32.Parse(args[0]);
+ } catch (Exception e) {
+ if ( (e is IndexOutOfRangeException) || (e is FormatException) || (e is OverflowException) ) {
+ Console.WriteLine("args: uint - number of GB to allocate");
+ return 0;
+ }
+ throw;
+ }
+
+ LargeExceptionTest test = new LargeExceptionTest(size);
+
+
+ if (test.RunTests()) {
+ Console.WriteLine("Test passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test failed");
+ return 0;
+ }
+}
+
diff --git a/tests/src/GC/LargeMemory/Allocation/largeexceptiontest.csproj b/tests/src/GC/LargeMemory/Allocation/largeexceptiontest.csproj
new file mode 100644
index 0000000000..a8655304d4
--- /dev/null
+++ b/tests/src/GC/LargeMemory/Allocation/largeexceptiontest.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>2</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LargeExceptionTest.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="LargeObject.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/LargeMemory/Allocation/largeobject.cs b/tests/src/GC/LargeMemory/Allocation/largeobject.cs
new file mode 100644
index 0000000000..6d7bef35a0
--- /dev/null
+++ b/tests/src/GC/LargeMemory/Allocation/largeobject.cs
@@ -0,0 +1,50 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+//[Serializable()]
+public sealed class LargeObject {
+
+ private byte[][] data;
+ private uint sizeInGB;
+ private LargeObject next;
+ public static int FinalizedCount = 0;
+
+ public const long GB = 1024*1024*1024;
+
+ public LargeObject(uint sizeInGB):this(sizeInGB, false)
+ {
+ }
+
+ public LargeObject(uint sizeInGB, bool finalize) {
+ this.sizeInGB = sizeInGB;
+
+ if (!finalize) {
+ GC.SuppressFinalize(this);
+ }
+
+ data = new byte[sizeInGB][];
+ for (int i=0; i<sizeInGB; i++) {
+ data[i] = new byte[GB];
+ }
+ }
+
+ ~LargeObject() {
+ Console.WriteLine("Finalized");
+ FinalizedCount++;
+ }
+
+ public long Size {
+ get {
+ return sizeInGB*GB;
+ }
+ }
+
+ public LargeObject Next {
+ get { return next; }
+ set { next = value; }
+ }
+
+}
diff --git a/tests/src/GC/LargeMemory/Allocation/largeobject.csproj b/tests/src/GC/LargeMemory/Allocation/largeobject.csproj
new file mode 100644
index 0000000000..519a2816bf
--- /dev/null
+++ b/tests/src/GC/LargeMemory/Allocation/largeobject.csproj
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestKind>BuildOnly</CLRTestKind>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LargeObject.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/LargeMemory/Regressions/app.config b/tests/src/GC/LargeMemory/Regressions/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/LargeMemory/Regressions/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/LargeMemory/Regressions/largearraytest.cs b/tests/src/GC/LargeMemory/Regressions/largearraytest.cs
new file mode 100644
index 0000000000..f5e0385872
--- /dev/null
+++ b/tests/src/GC/LargeMemory/Regressions/largearraytest.cs
@@ -0,0 +1,38 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/* NAME: LargeArrayTest
+ * DATE: 2004-03-02
+ * DESCRIPTION: creates arrays of size Int32.MaxValue through Int32.MaxValue-100 inclusive
+ */
+
+using System;
+
+public class LargeArrayTest {
+
+ public static int Main(string[] args) {
+
+ for (int i=0; i<= 100; i++) {
+ try {
+ Console.Write("now try Int32.MaxValue-{0}: ", i);
+ Array a = Array.CreateInstance((new byte().GetType()), Int32.MaxValue-i);
+ Console.WriteLine(a.Length);
+ a = null;
+ } catch (OutOfMemoryException e) {
+ Console.WriteLine();
+ Console.WriteLine(e.Message);
+ } catch (Exception e) {
+ Console.WriteLine();
+ Console.WriteLine("Unexpected Exception!");
+ Console.WriteLine(e);
+ Console.WriteLine("Test Failed!");
+ return 0;
+ }
+ }
+
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+
+}
diff --git a/tests/src/GC/LargeMemory/Regressions/largearraytest.csproj b/tests/src/GC/LargeMemory/Regressions/largearraytest.csproj
new file mode 100644
index 0000000000..2b9dd89357
--- /dev/null
+++ b/tests/src/GC/LargeMemory/Regressions/largearraytest.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LargeArrayTest.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/LargeMemory/Regressions/pressureoverflow.cs b/tests/src/GC/LargeMemory/Regressions/pressureoverflow.cs
new file mode 100644
index 0000000000..2316989991
--- /dev/null
+++ b/tests/src/GC/LargeMemory/Regressions/pressureoverflow.cs
@@ -0,0 +1,91 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/* NAME: PressureOverflow
+ * DATE: 2004-03-22
+ */
+
+using System;
+
+public class PressureOverflow {
+
+ int numTests = 0;
+
+ // memory pressure should overflow when increased beyond ulong.MaxInt
+ public bool AddTest() {
+ numTests++;
+ bool retVal = false;
+
+ for (int i=0; i<3; i++) {
+ try {
+ GC.AddMemoryPressure(Int64.MaxValue);
+ retVal = true;
+ } catch (ArgumentOutOfRangeException) {
+ Console.WriteLine("This test is for 64-bit only!");
+ retVal = true;
+ break;
+ } catch (Exception e) {
+ Console.WriteLine("Caught unexpected exception at {0}", i);
+ Console.WriteLine(e);
+ retVal = false;
+ break;
+ }
+
+ }
+
+ return retVal;
+
+ }
+
+ // memory pressure should underflow when decreased beyond ulong.MaxInt
+ public bool RemoveTest() {
+ numTests++;
+ bool retVal = false;
+
+ for (int i=0; i<3; i++) {
+ try {
+ GC.RemoveMemoryPressure(Int64.MaxValue);
+ retVal = true;
+ } catch (ArgumentOutOfRangeException) {
+ Console.WriteLine("This test is for 64-bit only!");
+ retVal = true;
+ break;
+ } catch (Exception e) {
+ Console.WriteLine("Caught unexpected exception at {0}", i);
+ Console.WriteLine(e);
+ retVal = false;
+ break;
+ }
+ }
+ return retVal;
+
+ }
+
+ public bool RunTest() {
+
+ int numPassed = 0;
+
+ if (AddTest())
+ numPassed++;
+ if (RemoveTest())
+ numPassed++;
+
+ return (numPassed == numTests);
+ }
+
+
+ public static int Main() {
+
+ PressureOverflow a = new PressureOverflow();
+
+ if (a.RunTest()) {
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+ Console.WriteLine("Test Failed!");
+ return 1;
+
+
+ }
+}
diff --git a/tests/src/GC/LargeMemory/Regressions/pressureoverflow.csproj b/tests/src/GC/LargeMemory/Regressions/pressureoverflow.csproj
new file mode 100644
index 0000000000..7381bf0c21
--- /dev/null
+++ b/tests/src/GC/LargeMemory/Regressions/pressureoverflow.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="PressureOverflow.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/M10/RefCrossTHDs/app.config b/tests/src/GC/M10/RefCrossTHDs/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/M10/RefCrossTHDs/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/M10/RefCrossTHDs/refcrossthds.cs b/tests/src/GC/M10/RefCrossTHDs/refcrossthds.cs
new file mode 100644
index 0000000000..c5061b94a3
--- /dev/null
+++ b/tests/src/GC/M10/RefCrossTHDs/refcrossthds.cs
@@ -0,0 +1,172 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.IO;
+
+namespace CrossThds
+{
+ using System.Reflection;
+ using System.Threading;
+
+ class Node
+ {
+ int [] mem;
+ public Node Next;
+ public Node Last;
+ public Node()
+ {
+ mem= new int[256]; //1K
+ mem[0] = 0;
+ mem[255] = 256;
+ Next = null;
+ Last = null;
+ }
+ }
+
+ class RefCrossThds
+ {
+ static Object [] ObjAry = new Object[2];
+
+ public RefCrossThds()
+ {
+// console synchronization Console.SetOut(TextWriter.Synchronized(Console.Out));
+ }
+
+ private static void ThreadAbort(Thread thread)
+ {
+ MethodInfo abort = null;
+ foreach(MethodInfo m in thread.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance))
+ {
+ if (m.Name.Equals("AbortInternal") && m.GetParameters().Length == 0) abort = m;
+ }
+ if (abort == null) {
+ throw new Exception("Failed to get Thread.Abort method");
+ }
+ abort.Invoke(thread, new object[0]);
+ }
+
+ public static int Main(String [] str)
+ {
+ Console.Out.WriteLine( "RefCrossThds");
+ Console.Out.WriteLine( "Should exit with a 100");
+ // console synchronization Console.SetOut(TextWriter.Synchronized(Console.Out));
+ Thread [] thd = new Thread[2];
+ RefCrossThds mainobj = new RefCrossThds();
+
+ for(int i=0; i< 2; i++)
+ {
+ ObjAry[i] = new Node();
+ }
+
+ for( int i=0; i<2; i++ )
+ {
+ thd[i] = new Thread( new ThreadStart( mainobj.RunThread ) );
+ thd[i].Start();
+ }
+ Thread.Sleep(5000);
+ for(int i=0; i< 2; i++)
+ {
+ ThreadAbort(thd[i]);
+// thd[i].Join();
+ }
+ Console.Out.WriteLine( "Test Passed");
+ return 100;
+ }
+
+ void RunThread()
+ {
+ Random Ran;
+ Ran = new Random();
+ while(true)
+ {
+ int iRand = Ran.Next(0, 512);
+ if( iRand%2 == 0 )
+ lock (ObjAry[0]) {DoDoubLink(ObjAry[0], iRand/2);}
+ else
+ lock (ObjAry[1]) {DoSingLink(ObjAry[1], iRand/2+1);}
+ }
+ }
+
+ //**create or delete a node from double link list. **/
+ //**If the passin index is smaller than the length of the double link list, **/
+ //**delete the object at the index, otherwise add a new object to the list. **/
+ static
+ void DoDoubLink(Object head, int index)
+ {
+ int depth = 0;
+
+ Node Current = (Node)head;
+ bool bAdd;
+ while( true )
+ {
+ if( Current.Next == null)
+ {
+ bAdd = true;
+ break;
+ }
+ else
+ {
+ if( index == depth )
+ {
+ bAdd = false;
+ break;
+ }
+ depth++;
+ }
+ Current = Current.Next;
+ }
+
+ if( bAdd )
+ {
+ Current.Next = new Node();
+ Current.Next.Last = Current;
+ }
+ else
+ {
+ Current.Last = Current.Next;
+ Current.Next.Last = Current.Last;
+ }
+ }
+
+ //**create or delete a node from single link list. **/
+ //**If the passin index is smaller than the length of the single link list, **/
+ //**delete the object at the index, otherwise add a new object to the list. **/
+ static
+ void DoSingLink(Object head, int index)
+ {
+ int depth = 0;
+ Node Current = (Node)head;
+ bool bAdd;
+ while( true )
+ {
+ if( Current.Next == null)
+ {
+ bAdd = true;
+ break;
+ }
+ else
+ {
+ if( index == depth )
+ {
+ bAdd = false;
+ break;
+ }
+ depth++;
+ }
+ Current = Current.Next;
+ }
+
+ if( bAdd )
+ {
+ Current.Next = new Node();
+ }
+ else
+ {
+ Current.Last = Current.Next;
+ }
+ }
+ }
+
+}//end of namespace \ No newline at end of file
diff --git a/tests/src/GC/M10/RefCrossTHDs/refcrossthds.csproj b/tests/src/GC/M10/RefCrossTHDs/refcrossthds.csproj
new file mode 100644
index 0000000000..347bae2101
--- /dev/null
+++ b/tests/src/GC/M10/RefCrossTHDs/refcrossthds.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="RefCrossThds.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Regressions/dev10bugs/536168/536168.cs b/tests/src/GC/Regressions/dev10bugs/536168/536168.cs
new file mode 100644
index 0000000000..fc5f2f992f
--- /dev/null
+++ b/tests/src/GC/Regressions/dev10bugs/536168/536168.cs
@@ -0,0 +1,65 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+using System.Threading;
+
+public class Program
+{
+ private static volatile int g_completed = 0;
+ private static int g_interations = 5000000;
+
+ public void Test()
+ {
+
+ int?[] values = new int?[128 * 1024];
+
+ for (int i = 0; i < values.Length; i++) values[i] = 5;
+
+ for (int i = 0; i < values.Length; i++)
+ {
+
+ values[i] = (int)0x42424242;
+
+ if (IsNull(values[i])) Console.WriteLine("Null found.");
+
+ }
+
+ System.Threading.Interlocked.Increment(ref g_completed);
+ }
+
+ public virtual bool IsNull(int? x)
+ {
+
+ return x == null;
+
+ }
+
+ public static int Main()
+ {
+
+ Program p = new Program();
+
+ for (int i = 0; i < g_interations; i++)
+ {
+
+ ThreadPool.QueueUserWorkItem(o => p.Test());
+
+ }
+
+ while (true)
+ {
+ GC.Collect();
+
+ Thread.Sleep(1);
+
+ if (g_completed >= g_interations) break;
+ }
+
+ return 100;
+
+ }
+
+}
diff --git a/tests/src/GC/Regressions/dev10bugs/536168/536168.csproj b/tests/src/GC/Regressions/dev10bugs/536168/536168.csproj
new file mode 100644
index 0000000000..f2b5942fe9
--- /dev/null
+++ b/tests/src/GC/Regressions/dev10bugs/536168/536168.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="536168.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Regressions/dev10bugs/536168/app.config b/tests/src/GC/Regressions/dev10bugs/536168/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Regressions/dev10bugs/536168/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Regressions/v2.0-beta1/149926/149926.cs b/tests/src/GC/Regressions/v2.0-beta1/149926/149926.cs
index 2ba6e6594b..dda7cd6c25 100644
--- a/tests/src/GC/Regressions/v2.0-beta1/149926/149926.cs
+++ b/tests/src/GC/Regressions/v2.0-beta1/149926/149926.cs
@@ -2,8 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-//VSWhidbey bug# 149926 - OutOfMemoryException allocating a byte array
-
using System;
public class ArrayOOM
diff --git a/tests/src/GC/Regressions/v2.0-beta1/149926/149926.csproj b/tests/src/GC/Regressions/v2.0-beta1/149926/149926.csproj
index 1b4f14496a..669fa78adb 100644
--- a/tests/src/GC/Regressions/v2.0-beta1/149926/149926.csproj
+++ b/tests/src/GC/Regressions/v2.0-beta1/149926/149926.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Regressions/v2.0-beta1/149926/project.json b/tests/src/GC/Regressions/v2.0-beta1/149926/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Regressions/v2.0-beta1/149926/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Regressions/v2.0-beta1/289745/289745.cs b/tests/src/GC/Regressions/v2.0-beta1/289745/289745.cs
index ad4ab202eb..a8ca213879 100644
--- a/tests/src/GC/Regressions/v2.0-beta1/289745/289745.cs
+++ b/tests/src/GC/Regressions/v2.0-beta1/289745/289745.cs
@@ -3,8 +3,6 @@
// See the LICENSE file in the project root for more information.
/*
- * SDET: clyon
- * BUG: 289745 (wks), 302560 (svr)
* DESCRIPTION: GC clobbers read-only frozen segments
* NOTE: if unable to repro, tweak the array lengths depending on the amount of physical ram in your machine
*/
diff --git a/tests/src/GC/Regressions/v2.0-beta1/289745/289745.csproj b/tests/src/GC/Regressions/v2.0-beta1/289745/289745.csproj
index b6399224b9..5e17987d9b 100644
--- a/tests/src/GC/Regressions/v2.0-beta1/289745/289745.csproj
+++ b/tests/src/GC/Regressions/v2.0-beta1/289745/289745.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Regressions/v2.0-beta1/289745/302560.csproj b/tests/src/GC/Regressions/v2.0-beta1/289745/302560.csproj
index b6399224b9..5e17987d9b 100644
--- a/tests/src/GC/Regressions/v2.0-beta1/289745/302560.csproj
+++ b/tests/src/GC/Regressions/v2.0-beta1/289745/302560.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Regressions/v2.0-beta1/289745/project.json b/tests/src/GC/Regressions/v2.0-beta1/289745/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Regressions/v2.0-beta1/289745/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Regressions/v2.0-beta2/426480/426480.csproj b/tests/src/GC/Regressions/v2.0-beta2/426480/426480.csproj
index 093d14fe57..3e4639e51f 100644
--- a/tests/src/GC/Regressions/v2.0-beta2/426480/426480.csproj
+++ b/tests/src/GC/Regressions/v2.0-beta2/426480/426480.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Regressions/v2.0-beta2/426480/project.json b/tests/src/GC/Regressions/v2.0-beta2/426480/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Regressions/v2.0-beta2/426480/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Regressions/v2.0-beta2/437657/437657.cs b/tests/src/GC/Regressions/v2.0-beta2/437657/437657.cs
new file mode 100644
index 0000000000..44c8f9e860
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/437657/437657.cs
@@ -0,0 +1,333 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*
+a good test would be to create a big object with very sparse pointers embedded.
+For example, you can create an array of value types and each value type has
+mostly integers, say 100 integers and only 2 pointers. When we push stuff onto
+the mark stack we first push all the 1st level sub pointers onto the stack at
+once. So you want to create an object with that big array embedded in it. This
+is a test program that I used to test the change but you'd have to modify it a
+little bit to see a noticable difference. But it's good enough to illustrate
+the point.
+*/
+
+using System;
+using System.Runtime;
+using System.Runtime.InteropServices;
+
+public class A
+{
+ public int a;
+ public A()
+ {
+ a = 1;
+ }
+}
+
+public class B
+{
+ public int b;
+ public B()
+ {
+ b = 2;
+ }
+}
+
+[StructLayout(LayoutKind.Sequential)]
+public struct C
+{
+
+ int i00;
+ int i01;
+ int i02;
+ int i03;
+ int i04;
+ int i05;
+ int i06;
+ int i07;
+ int i08;
+ int i09;
+ int i10;
+ int i11;
+ int i12;
+ int i13;
+ int i14;
+ int i15;
+ int i16;
+ int i17;
+ int i18;
+ int i19;
+ int i20;
+ int i21;
+ int i22;
+ int i23;
+ int i24;
+ int i25;
+ int i26;
+ int i27;
+ int i28;
+ int i29;
+ int i30;
+ int i31;
+ int i32;
+ int i33;
+
+ public A t1;
+
+ int i34;
+ int i35;
+ int i36;
+ int i37;
+ int i38;
+ int i39;
+ int i40;
+ int i41;
+ int i42;
+ int i43;
+ int i44;
+ int i45;
+ int i46;
+ int i47;
+ int i48;
+ int i49;
+ int i50;
+ int i51;
+ int i52;
+ int i53;
+ int i54;
+ int i55;
+ int i56;
+ int i57;
+ int i58;
+ int i59;
+ int i60;
+ int i61;
+ int i62;
+ int i63;
+ int i64;
+ int i65;
+ int i66;
+
+ public B t2;
+
+ int i67;
+ int i68;
+ int i69;
+ int i70;
+ int i71;
+ int i72;
+ int i73;
+ int i74;
+ int i75;
+ int i76;
+ int i77;
+ int i78;
+ int i79;
+ int i80;
+ int i81;
+ int i82;
+ int i83;
+ int i84;
+ int i85;
+ int i86;
+ int i87;
+ int i88;
+ int i89;
+ int i90;
+ int i91;
+ int i92;
+ int i93;
+ int i94;
+ int i95;
+ int i96;
+ int i97;
+ int i98;
+ int i99;
+ int j00;
+ int j01;
+ int j02;
+ int j03;
+ int j04;
+ int j05;
+ int j06;
+ int j07;
+ int j08;
+ int j09;
+ int j10;
+ int j11;
+ int j12;
+ int j13;
+ int j14;
+ int j15;
+ int j16;
+ int j17;
+ int j18;
+ int j19;
+ int j20;
+ int j21;
+ int j22;
+ int j23;
+ int j24;
+ int j25;
+ int j26;
+ int j27;
+ int j28;
+ int j29;
+ int j30;
+ int j31;
+ int j32;
+ int j33;
+
+ public A t3;
+
+ int j34;
+ int j35;
+ int j36;
+ int j37;
+ int j38;
+ int j39;
+ int j40;
+ int j41;
+ int j42;
+ int j43;
+ int j44;
+ int j45;
+ int j46;
+ int j47;
+ int j48;
+ int j49;
+ int j50;
+ int j51;
+ int j52;
+ int j53;
+ int j54;
+ int j55;
+ int j56;
+ int j57;
+ int j58;
+ int j59;
+ int j60;
+ int j61;
+ int j62;
+ int j63;
+ int j64;
+ int j65;
+ int j66;
+
+ public B t4;
+
+ int j67;
+ int j68;
+ int j69;
+ int j70;
+ int j71;
+ int j72;
+ int j73;
+ int j74;
+ int j75;
+ int j76;
+ int j77;
+ int j78;
+ int j79;
+ int j80;
+ int j81;
+ int j82;
+ int j83;
+ int j84;
+ int j85;
+ int j86;
+ int j87;
+ int j88;
+ int j89;
+ int j90;
+ int j91;
+ int j92;
+ int j93;
+ int j94;
+ int j95;
+ int j96;
+ int j97;
+ int j98;
+ int j99;
+}
+
+
+
+
+class CC
+{
+ public C[] array;
+ public CC(int size)
+ {
+ array = new C[size];
+ }
+}
+
+
+class TestMark
+{
+
+ public static int Main(string[] arg)
+ {
+
+ Console.WriteLine("Before allocation: {0}", TestMark.GetCommitted());
+
+ CC cc = new CC(500000);
+ cc.array[1024].t1 = new A();
+ cc.array[1024].t1.a = 3;
+ cc.array[1024].t2 = new B();
+ cc.array[1024].t2.b = 4;
+
+ long a = TestMark.GetCommitted();
+ Console.WriteLine("After allocation: {0}", a);
+ Console.WriteLine();
+ Console.WriteLine("Collecting...");
+ for (int i=0; i<100; i++)
+ {
+ GC.Collect();
+ }
+
+ long b= TestMark.GetCommitted();
+ Console.WriteLine("After 100 Collections: {0}", b);
+ GC.KeepAlive(cc);
+
+ if (Math.Abs(b- a) > (a/2))
+ {
+ Console.WriteLine("failed");
+ return 0;
+ }
+
+ Console.WriteLine("passed");
+ return 100;
+
+
+ }
+
+ [DllImport( "Kernel32.dll", CharSet=CharSet.Ansi )]
+ public static extern bool GlobalMemoryStatusEx( MemoryStatusEx memStatus);
+
+ public static long GetCommitted()
+ {
+ MemoryStatusEx mex = new MemoryStatusEx();
+ mex.length = Marshal.SizeOf(mex);
+ GlobalMemoryStatusEx(mex);
+ return mex.totalPageFile - mex.availPageFile;
+ }
+
+}
+
+[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi )]
+public class MemoryStatusEx
+{
+ public int length = 0;
+ public int memoryLoad = 0;
+ public long totalPhys = 0;
+ public long availPhys = 0;
+ public long totalPageFile = 0;
+ public long availPageFile = 0;
+ public long totalVirtual = 0;
+ public long availVirtual = 0;
+ public long availExtendedVirtual = 0;
+}
diff --git a/tests/src/GC/Regressions/v2.0-beta2/437657/437657.csproj b/tests/src/GC/Regressions/v2.0-beta2/437657/437657.csproj
new file mode 100644
index 0000000000..c07f5aa1a2
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/437657/437657.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="437657.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Regressions/v2.0-beta2/437657/app.config b/tests/src/GC/Regressions/v2.0-beta2/437657/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/437657/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Regressions/v2.0-beta2/445488/445488.cs b/tests/src/GC/Regressions/v2.0-beta2/445488/445488.cs
new file mode 100644
index 0000000000..c2b356c4f4
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/445488/445488.cs
@@ -0,0 +1,135 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Runtime;
+using System.Diagnostics;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Unicode )]
+public class Node
+{
+ GCHandle gch1;
+ byte[] pinnedData1;
+ public Node Next;
+
+
+ public Node()
+ {
+ pinnedData1 = new byte[1024*50];
+ gch1 = GCHandle.Alloc(pinnedData1, GCHandleType.Pinned);
+ }
+}
+
+public class Test
+{
+ //public static PerformanceCounter PC;
+
+
+ public static int Main()
+ {
+ List<byte[]> list = new List<byte[]>();
+ List<GCHandle> glist = new List<GCHandle>();
+ //PC = new PerformanceCounter(".NET CLR Memory", "Gen 0 heap size", "445488", ".");
+ long count =0;
+
+ while (count <= 124979200)
+ {
+ //float gen0size = PC.NextValue();
+ byte[] b = new byte[1024*50];
+ count += (1024*50);
+
+ if (count % (1024*2500)==0)
+ {
+ glist.Add(GCHandle.Alloc(b, GCHandleType.Pinned));
+ }
+
+ list.Add(b);
+ //Console.WriteLine("{0} {1:F}",count, gen0size);
+ }
+
+ GC.KeepAlive(list);
+ GC.KeepAlive(glist);
+ return 100;
+
+ }
+
+}
+
+/*
+124979200 3075360.00
+---------------------------
+424916.exe - Assert Failure (PID 2336, Thread 1248/4e0)
+---------------------------
+mi1 >= 0
+
+MSCORWKS! WKS::gc_heap::allocate_in_expanded_heap + 0x181 (0x5db32de9)
+MSCORWKS! WKS::gc_heap::realloc_plug + 0x1B5 (0x5db36a16)
+MSCORWKS! WKS::gc_heap::realloc_in_brick + 0x75 (0x5db36b3d)
+MSCORWKS! WKS::gc_heap::realloc_plugs + 0xAE (0x5db36bff)
+MSCORWKS! WKS::gc_heap::expand_heap + 0x478 (0x5db4049e)
+MSCORWKS! WKS::gc_heap::plan_phase + 0x1167 (0x5db43383)
+MSCORWKS! WKS::gc_heap::gc1 + 0x92 (0x5db43d85)
+MSCORWKS! WKS::gc_heap::garbage_collect + 0x3FE (0x5db44ee7)
+MSCORWKS! WKS::GCHeap::GarbageCollectGeneration + 0x23D (0x5db45162)
+MSCORWKS! WKS::gc_heap::allocate_more_space + 0x45A (0x5db456ae)
+
+f:\pd7\ndp\clr\src\vm\gc.cpp, Line: 7464
+
+Abort - Kill program
+Retry - Debug
+Ignore - Keep running
+
+
+Image:
+D:\temp\424916.exe
+
+---------------------------
+Abort Retry Ignore
+---------------------------
+
+Ignoring the asserts generates the AV from the bug report:
+
+
+ # ChildEBP RetAddr
+00 0012d250 5e24645f mscorwks!DbgAssertDialog+0x394
+01 0012d618 5dcedf7c mscorwks!CHECK::Trigger+0x2df
+02 0012d800 5dcedb2d mscorwks!CLRVectoredExceptionHandlerPhase2+0x33c
+03 0012d864 5d9cfd67 mscorwks!CLRVectoredExceptionHandler+0xcd
+04 0012d890 5d9cfc4a mscorwks!CPFH_FirstPassHandler+0xc7
+05 0012d8c4 7c9037bf mscorwks!COMPlusFrameHandler+0x14a
+WARNING: Stack unwind information not available. Following frames may be wrong.
+06 0012d8e8 7c90378b ntdll!RtlConvertUlongToLargeInteger+0x7a
+07 0012d998 7c90eafa ntdll!RtlConvertUlongToLargeInteger+0x46
+08 0012dca4 5e03ec96 ntdll!KiUserExceptionDispatcher+0xe
+09 0012dcb8 5e03ea89 mscorwks!WKS::gc_heap::gcmemcopy+0x86
+0a 0012dce4 5e03eda4 mscorwks!WKS::gc_heap::compact_plug+0xf9
+0b 0012dd18 5e03f02f mscorwks!WKS::gc_heap::compact_in_brick+0xd4
+0c 0012dd5c 5e03bce5 mscorwks!WKS::gc_heap::compact_phase+0x24f
+0d 0012df5c 5e03618e mscorwks!WKS::gc_heap::plan_phase+0x19e5
+0e 0012dfa0 5e036a6f mscorwks!WKS::gc_heap::gc1+0xae
+0f 0012dfb4 5e04af14 mscorwks!WKS::gc_heap::garbage_collect+0x4df
+10 0012dfe4 5e0333b8 mscorwks!WKS::GCHeap::GarbageCollectGeneration+0x1e4
+11 0012e0b4 5e04a17b mscorwks!WKS::gc_heap::allocate_more_space+0x4a8
+12 0012e0d4 5e04a9e8 mscorwks!WKS::gc_heap::allocate+0x8b
+13 0012e184 5de64ff6 mscorwks!WKS::GCHeap::Alloc+0x1f8
+14 0012e290 5de65ab8 mscorwks!Alloc+0x256
+15 0012e388 5de39ead mscorwks!FastAllocatePrimitiveArray+0x3f8
+*** WARNING: Unable to verify checksum for D:\WINDOWS\Microsoft.NET\Framework\v2.0.x86dbg\assembly\NativeImages_v2.0.x86dbg_32\mscorlib\ab6a82069375373ebc7e85bf2de124cb\mscorlib.ni.dll
+*** ERROR: Module load completed but symbols could not be loaded for D:\WINDOWS\Microsoft.NET\Framework\v2.0.x86dbg\assembly\NativeImages_v2.0.x86dbg_32\mscorlib\ab6a82069375373ebc7e85bf2de124cb\mscorlib.ni.dll
+16 0012e54c 5b69d907 mscorwks!JIT_NewArr1+0x4dd
+17 0012e610 5b69d716 mscorlib_ni!Microsoft.Win32.RegistryKey.InternalGetValue(System.String, System.Object, Boolean, Boolean)+0x147
+18 0012e610 5b69d716 mscorlib_ni!Microsoft.Win32.RegistryKey.InternalGetValue(System.String, System.Object, Boolean, Boolean)+0x147
+19 00000000 7a7e6865 mscorlib_ni!Microsoft.Win32.RegistryKey.GetValue(System.String)+0x36
+*** WARNING: Unable to verify checksum for D:\WINDOWS\Microsoft.NET\Framework\v2.0.x86dbg\assembly\NativeImages_v2.0.x86dbg_32\System\08fb29f559b89437a7fc3f4a7dbde9c1\System.ni.dll
+*** ERROR: Module load completed but symbols could not be loaded for D:\WINDOWS\Microsoft.NET\Framework\v2.0.x86dbg\assembly\NativeImages_v2.0.x86dbg_32\System\08fb29f559b89437a7fc3f4a7dbde9c1\System.ni.dll
+1a 0012e66c 7a7e617f System_ni!System.Diagnostics.PerformanceMonitor.GetData(System.String)+0x55
+1b 0012e6a0 7a7e57fe System_ni!System.Diagnostics.PerformanceCounterLib.GetPerformanceData(System.String)+0x97
+1c 00a855a4 7a7e5742 System_ni!System.Diagnostics.PerformanceCounterLib.GetCategorySample(System.String)+0x62
+1d 0012e738 7a7e24e0 System_ni!System.Diagnostics.PerformanceCounterLib.GetCategorySample(System.String, System.String)+0x36
+1e 0012e738 7a7e2651 System_ni!System.Diagnostics.PerformanceCounter.NextSample()+0x64
+1f 04ffb000 02c800f0 System_ni!System.Diagnostics.PerformanceCounter.NextValue()+0x21
+20 04ffb000 00000000 445488!Test.Main()+0x80
+*/
diff --git a/tests/src/GC/Regressions/v2.0-beta2/445488/445488.csproj b/tests/src/GC/Regressions/v2.0-beta2/445488/445488.csproj
new file mode 100644
index 0000000000..f19d924dc4
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/445488/445488.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="445488.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Regressions/v2.0-beta2/445488/app.config b/tests/src/GC/Regressions/v2.0-beta2/445488/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/445488/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Regressions/v2.0-beta2/452950/452950.cs b/tests/src/GC/Regressions/v2.0-beta2/452950/452950.cs
new file mode 100644
index 0000000000..9b3a1ac931
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/452950/452950.cs
@@ -0,0 +1,54 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+public class b452950
+{
+ public static List<GCHandle> list = new List<GCHandle>();
+ public static int DEFAULT = 1000;
+
+ public static int Main(string[] args)
+ {
+
+ int numIterations = 0;
+ if (args.Length >0)
+ {
+ Int32.TryParse(args[0], out numIterations);
+ if (numIterations<0)
+ {
+ numIterations=DEFAULT;
+ }
+ }
+ else
+ {
+ numIterations= DEFAULT;
+ }
+
+ // fragment the heap
+ for (int i=0; i<numIterations; i++)
+ {
+ byte[] b = new byte[1024*50];
+ list.Add(GCHandle.Alloc(b, GCHandleType.Pinned));
+ byte[] b2 = new byte[1024*50];
+
+ }
+
+ int gcCount = GC.CollectionCount(GC.MaxGeneration);
+ Console.WriteLine(gcCount);
+
+ // if we do a full collection <= (5% of the interations) times, we pass
+ if (gcCount <= (numIterations*0.05))
+ {
+ Console.WriteLine("Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Failed");
+ return 1;
+ }
+}
+
diff --git a/tests/src/GC/Regressions/v2.0-beta2/452950/452950.csproj b/tests/src/GC/Regressions/v2.0-beta2/452950/452950.csproj
new file mode 100644
index 0000000000..247966c13d
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/452950/452950.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="452950.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Regressions/v2.0-beta2/452950/app.config b/tests/src/GC/Regressions/v2.0-beta2/452950/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/452950/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Regressions/v2.0-beta2/460373/460373.cs b/tests/src/GC/Regressions/v2.0-beta2/460373/460373.cs
new file mode 100644
index 0000000000..9f8c18bf65
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/460373/460373.cs
@@ -0,0 +1,117 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// seg 4MB, gen0 4MB: regression test for 424916
+// seg 8MB, gen0 4MB regression test for 460373
+
+using System;
+using System.Runtime;
+using System.Diagnostics;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+namespace b424916
+{
+
+ [ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Unicode )]
+ public class Node
+ {
+ GCHandle gch1;
+ byte[] unpinnedData1;
+ byte[] pinnedData1;
+ byte[] unpinnedData2;
+ byte[] unpinnedData3;
+ byte[] unpinnedData4;
+ byte[] pinnedData2;
+ byte[] unpinnedData5;
+ GCHandle gch2;
+ public Node Next;
+
+ [System.Security.SecuritySafeCritical]
+ public Node()
+ {
+
+ pinnedData1 = new byte[10];
+ gch1 = GCHandle.Alloc(pinnedData1, GCHandleType.Pinned);
+ pinnedData2 = new byte[10];
+ gch2 = GCHandle.Alloc(pinnedData2, GCHandleType.Pinned);
+
+ unpinnedData1 = new byte[1024*80];
+ unpinnedData2 = new byte[1024*80];
+ unpinnedData3 = new byte[1024*80];
+ unpinnedData4 = new byte[1024*80];
+ unpinnedData5 = new byte[1024*80];
+
+ }
+ }
+
+ public class Test
+ {
+
+ public static int Main()
+ {
+
+ Node head = new Node();
+ Node cur = head;
+
+ for (int i=0; i<1250; i++)
+ {
+ cur.Next = new Node();
+ cur = cur.Next;
+ GC.KeepAlive(head);
+
+ }
+
+ return 100;
+ }
+ }
+}
+
+/*
+PD7 asserts:
+
+segment size: 4MB
+gen0 initial size: 4MB
+(at time of assert, gen0 is ~8MB)
+
+Assert failure(PID 2560 [0x00000a00], Thread: 2488 [0x9b8]): (heap_segment_rw (g
+eneration_start_segment (gen))!= ephemeral_heap_segment) || (gap_start > generat
+ion_allocation_start (gen))
+
+MSCORWKS! WKS::gc_heap::thread_gap + 0x5A (0x5db3bb55)
+MSCORWKS! WKS::gc_heap::plan_phase + 0x17CF (0x5db439eb)
+MSCORWKS! WKS::gc_heap::gc1 + 0x92 (0x5db43d85)
+MSCORWKS! WKS::gc_heap::garbage_collect + 0x3FE (0x5db44ee7)
+MSCORWKS! WKS::GCHeap::GarbageCollectGeneration + 0x23D (0x5db45162)
+MSCORWKS! WKS::gc_heap::allocate_more_space + 0x124 (0x5db45378)
+MSCORWKS! WKS::GCHeap::Alloc + 0x11D (0x5db4619d)
+MSCORWKS! Alloc + 0x13A (0x5d9c90b8)
+MSCORWKS! FastAllocatePrimitiveArray + 0x21B (0x5d9c9da2)
+MSCORWKS! JIT_NewArr1 + 0x2CF (0x5d9d5155)
+ File: f:\pd7\ndp\clr\src\vm\gc.cpp, Line: 12792 Image:
+D:\temp\424916.exe
+
+
+
+segment size: 8MB
+gen0 initial size: 4MB
+(at time of assert, gen0 is ~8KB)
+
+Assert failure(PID 2172 [0x0000087c], Thread: 3668 [0xe54]): !"Can't allocate if
+ no free space"
+
+MSCORWKS! WKS::gc_heap::allocate_in_expanded_heap + 0x276 (0x5db32ede)
+MSCORWKS! WKS::gc_heap::realloc_plug + 0x1B5 (0x5db36a16)
+MSCORWKS! WKS::gc_heap::realloc_plugs + 0xE9 (0x5db36c3a)
+MSCORWKS! WKS::gc_heap::expand_heap + 0x478 (0x5db4049e)
+MSCORWKS! WKS::gc_heap::plan_phase + 0x1167 (0x5db43383)
+MSCORWKS! WKS::gc_heap::gc1 + 0x92 (0x5db43d85)
+MSCORWKS! WKS::gc_heap::garbage_collect + 0x3FE (0x5db44ee7)
+MSCORWKS! WKS::GCHeap::GarbageCollectGeneration + 0x23D (0x5db45162)
+MSCORWKS! WKS::GCHeap::GarbageCollectTry + 0x38 (0x5db4627e)
+MSCORWKS! WKS::GCHeap::GarbageCollect + 0x3B (0x5db462bd)
+ File: f:\pd7\ndp\clr\src\vm\gc.cpp, Line: 7490 Image:
+D:\temp\424916.exe
+
+*/
diff --git a/tests/src/GC/Regressions/v2.0-beta2/460373/460373.csproj b/tests/src/GC/Regressions/v2.0-beta2/460373/460373.csproj
new file mode 100644
index 0000000000..7f272f5c09
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/460373/460373.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="460373.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Regressions/v2.0-beta2/460373/app.config b/tests/src/GC/Regressions/v2.0-beta2/460373/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/460373/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Regressions/v2.0-beta2/462651/462651.cs b/tests/src/GC/Regressions/v2.0-beta2/462651/462651.cs
new file mode 100644
index 0000000000..6c2272a973
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/462651/462651.cs
@@ -0,0 +1,100 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Threading;
+using System.Text;
+using System.Runtime.InteropServices;
+
+
+class Mainy {
+
+[DllImport("kernel32")]
+public static extern void DebugBreak();
+
+
+public static void AllocStart()
+{
+ char [] bigCharArray = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd', 'e', 'f', 'g'};
+
+ int iCur = 0;
+ Random r = new Random(1);
+ Object [] cache = new Object[100];
+ String teststr = new String(bigCharArray);
+ String [] strArray = new String[1024];
+
+ // Allocate a bundle of "small" large objects and an occasional
+ // huge large object
+
+ int iCacheClear = 0; // when 1000, clear the cache
+ try
+ {
+ //while(true)
+ for (int j=0; j<5000; j++)
+ {
+ int iVal = r.Next(1,100);
+ if (iVal < 80)
+ {
+ cache[iCur] = new Byte[2];
+ Thread.Sleep(5);
+ }
+ else
+ {
+ StringBuilder sb = new StringBuilder();
+ for (int k=0; k < 1024; k++){
+ sb = sb.Append(teststr);
+ }
+ cache[iCur] = sb.ToString();
+ }
+ iCur = ((iCur + 1) % 50);
+ iCacheClear++;
+ if (iCacheClear == 1000)
+ {
+ Console.WriteLine("Clearing cache");
+ for(int i=0;i<50;i++)
+ cache[i] = null;
+ iCacheClear = 0;
+ }
+ }
+ }
+ catch (OutOfMemoryException)
+ {
+ Console.WriteLine("OOM");
+ }
+}
+
+public static int Main() {
+
+
+
+ int arrayLen = 1024*5;
+ Byte [][] cache = new Byte[arrayLen][];
+
+ for(int j=0; j< arrayLen; j++){
+ cache[j] = new Byte[1024];
+ }
+
+ Thread t = new Thread(new ThreadStart(AllocStart));
+ t.Start();
+
+
+ Thread t6 = new Thread(new ThreadStart(AllocStart));
+ t6.Start();
+
+ Thread t2 = new Thread(new ThreadStart(AllocStart));
+ t2.Start();
+
+
+ for(int i=0; i<1024; i++){
+ Thread.Sleep(250);
+ int j = cache[i].Length;
+ }
+
+ Console.WriteLine("finished");
+ return 100;
+}
+
+}
+
+
diff --git a/tests/src/GC/Regressions/v2.0-beta2/462651/462651.csproj b/tests/src/GC/Regressions/v2.0-beta2/462651/462651.csproj
new file mode 100644
index 0000000000..8091381243
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/462651/462651.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="462651.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Regressions/v2.0-beta2/462651/app.config b/tests/src/GC/Regressions/v2.0-beta2/462651/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Regressions/v2.0-beta2/462651/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Regressions/v2.0-beta2/471729/471729.csproj b/tests/src/GC/Regressions/v2.0-beta2/471729/471729.csproj
index 9734464e07..dce937b713 100644
--- a/tests/src/GC/Regressions/v2.0-beta2/471729/471729.csproj
+++ b/tests/src/GC/Regressions/v2.0-beta2/471729/471729.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Regressions/v2.0-beta2/471729/project.json b/tests/src/GC/Regressions/v2.0-beta2/471729/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Regressions/v2.0-beta2/471729/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Regressions/v2.0-beta2/476725/ManagedTest.csproj b/tests/src/GC/Regressions/v2.0-beta2/476725/ManagedTest.csproj
index 217914d321..f6d73551fd 100644
--- a/tests/src/GC/Regressions/v2.0-beta2/476725/ManagedTest.csproj
+++ b/tests/src/GC/Regressions/v2.0-beta2/476725/ManagedTest.csproj
@@ -32,8 +32,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Regressions/v2.0-beta2/476725/project.json b/tests/src/GC/Regressions/v2.0-beta2/476725/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Regressions/v2.0-beta2/476725/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Regressions/v2.0-beta2/485617/Managed.csproj b/tests/src/GC/Regressions/v2.0-beta2/485617/Managed.csproj
index 60624012cf..eb17c7b4d5 100644
--- a/tests/src/GC/Regressions/v2.0-beta2/485617/Managed.csproj
+++ b/tests/src/GC/Regressions/v2.0-beta2/485617/Managed.csproj
@@ -32,8 +32,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Regressions/v2.0-beta2/485617/project.json b/tests/src/GC/Regressions/v2.0-beta2/485617/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Regressions/v2.0-beta2/485617/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Regressions/v2.0-rtm/494226/494226.csproj b/tests/src/GC/Regressions/v2.0-rtm/494226/494226.csproj
index b904841465..56e1066f4f 100644
--- a/tests/src/GC/Regressions/v2.0-rtm/494226/494226.csproj
+++ b/tests/src/GC/Regressions/v2.0-rtm/494226/494226.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Regressions/v2.0-rtm/494226/project.json b/tests/src/GC/Regressions/v2.0-rtm/494226/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Regressions/v2.0-rtm/494226/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Regressions/v2.0-rtm/544701/544701.cs b/tests/src/GC/Regressions/v2.0-rtm/544701/544701.cs
index 184afabf83..7148f084bc 100644
--- a/tests/src/GC/Regressions/v2.0-rtm/544701/544701.cs
+++ b/tests/src/GC/Regressions/v2.0-rtm/544701/544701.cs
@@ -2,8 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-// originally a regression test for VSWhidbey 158720
-
using System;
internal class AllocBug
{
diff --git a/tests/src/GC/Regressions/v2.0-rtm/544701/544701.csproj b/tests/src/GC/Regressions/v2.0-rtm/544701/544701.csproj
index cd52324ad6..12e6b206d3 100644
--- a/tests/src/GC/Regressions/v2.0-rtm/544701/544701.csproj
+++ b/tests/src/GC/Regressions/v2.0-rtm/544701/544701.csproj
@@ -31,8 +31,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Regressions/v2.0-rtm/544701/project.json b/tests/src/GC/Regressions/v2.0-rtm/544701/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Regressions/v2.0-rtm/544701/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Scenarios/Affinity/affinitizer.cs b/tests/src/GC/Scenarios/Affinity/affinitizer.cs
new file mode 100644
index 0000000000..f780cc5507
--- /dev/null
+++ b/tests/src/GC/Scenarios/Affinity/affinitizer.cs
@@ -0,0 +1,129 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Threading;
+using System.Diagnostics;
+
+public class Affinitizer
+{
+
+ public static void Usage()
+ {
+ Console.WriteLine("Usage:");
+ Console.WriteLine("affinitizer.exe <num procs (0 for random)> <\"assembly.exe arg list\"> [random seed]");
+ }
+
+ public static int Main(string[] args)
+ {
+
+ if ((args.Length < 2) || (args.Length > 3))
+ {
+ Usage();
+ return 0;
+ }
+
+ int numProcessors = Environment.ProcessorCount;
+
+ // get affinity
+ IntPtr affinity = IntPtr.Zero;
+ int a = 0;
+ if ( (!int.TryParse(args[0], out a)) || (a < 0) )
+ {
+ Usage();
+ return 0;
+ }
+ // cap the number of procs to the max on the machine
+ affinity = new IntPtr(Math.Min(a, numProcessors));
+
+ // get process name and args
+ string processName = null;
+ string processArgs = null;
+ int firstSpaceIndex = args[1].Trim().IndexOf(' ');
+ if (firstSpaceIndex < 0)
+ {
+ // no args
+ processName = args[1];
+ }
+ else
+ {
+ processName = args[1].Substring(0, firstSpaceIndex);
+ processArgs = args[1].Substring(firstSpaceIndex + 1);
+ }
+
+ // get random seed
+ int seed = 0;
+ if (args.Length == 3)
+ {
+ if (!int.TryParse(args[2], out seed))
+ {
+ Usage();
+ return 0;
+ }
+ }
+ else
+ {
+ seed = (int)DateTime.Now.Ticks;
+ }
+
+ Console.WriteLine("Running on a {0}-processor machine", numProcessors);
+
+ return RunTest(affinity, processName, processArgs, seed);
+ }
+
+
+ public static int RunTest(IntPtr affinity, string processName, string processArgs, int seed)
+ {
+
+ // run the test
+ Random rand = null;
+
+ Process p = Process.Start(processName, processArgs);
+
+ // cannot set the affinity before the process starts in managed code
+ // This code executes so quickly that the GC heaps have not yet been initialized,
+ // so it works.
+ if (affinity != IntPtr.Zero)
+ {
+ // set affinity to (2^n)-1, where n=affinity
+ int newAffinity = (int)Math.Pow(2, affinity.ToInt32())-1;
+ p.ProcessorAffinity = new IntPtr(newAffinity);
+ Console.WriteLine("Affinitizing to {0}", newAffinity);
+ }
+ else
+ {
+ rand = new Random(seed);
+ Console.WriteLine("Using random seed: {0}", seed);
+ }
+
+ while (!p.HasExited)
+ {
+ // change affinity randomly every 5 seconds
+ Thread.Sleep(5000);
+ if (affinity == IntPtr.Zero)
+ {
+ try
+ {
+ // randomly change the affinity between 1 and (2^n)-1, where n=numProcessors
+ int newAffinity = rand.Next(1, (int)Math.Pow(2, Environment.ProcessorCount)-1);
+ p.ProcessorAffinity = new IntPtr(newAffinity);
+ Console.WriteLine("Affinitizing to {0}", newAffinity);
+ }
+ // we couldn't set the affinity, so just exit
+ catch (InvalidOperationException)
+ {
+ break;
+ }
+ catch (System.ComponentModel.Win32Exception)
+ {
+ break;
+ }
+ }
+
+ }
+
+ Console.WriteLine("Exiting with exit code {0}", p.ExitCode);
+ return p.ExitCode;
+ }
+}
diff --git a/tests/src/GC/Scenarios/Affinity/affinitizer.csproj b/tests/src/GC/Scenarios/Affinity/affinitizer.csproj
new file mode 100644
index 0000000000..6dc8ce2d98
--- /dev/null
+++ b/tests/src/GC/Scenarios/Affinity/affinitizer.csproj
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestKind>SharedLibrary</CLRTestKind>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="affinitizer.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Affinity/app.config b/tests/src/GC/Scenarios/Affinity/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/Affinity/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/BaseFinal/app.config b/tests/src/GC/Scenarios/BaseFinal/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/BaseFinal/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/BaseFinal/basefinal.cs b/tests/src/GC/Scenarios/BaseFinal/basefinal.cs
new file mode 100644
index 0000000000..5f61f2e984
--- /dev/null
+++ b/tests/src/GC/Scenarios/BaseFinal/basefinal.cs
@@ -0,0 +1,143 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*******************************************************************************/
+/* Test: BaseFinal
+/* Purpose: 1. if finalize() is called before the objects are GCed.
+/* 2. resurrect the object while the finalize() method is call.
+/*******************************************************************************/
+
+namespace DefaultNamespace {
+ using System;
+ using System.Collections.Generic;
+
+ internal class BaseFinal
+ {
+// disabling unused variable warning
+#pragma warning disable 0414
+ internal static Object StObj;
+#pragma warning restore 0414
+
+ public static int Main(String [] str)
+ {
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ CreateObj temp = new CreateObj();
+ if (temp.RunTest())
+ {
+ Console.WriteLine( "Test passed!" );
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine( "Test failed!" );
+ return 1;
+ }
+ }
+
+
+ ~BaseFinal()
+ {
+ BaseFinal.StObj = ( this );
+ Console.WriteLine( "Main class Finalize().");
+ }
+
+ public void CreateNode( int i )
+ {
+ BNode rgobj = new BNode( i );
+ }
+ }
+
+
+ internal class BNode
+ {
+ public static int icCreateNode = 0;
+ public static int icFinalNode = 0;
+ internal static List<object> rlNode = new List<object>( );
+ public int [] mem;
+
+ public BNode( int i )
+ {
+ icCreateNode++;
+ mem = new int[i];
+ mem[0] = 99;
+ if(i > 1 )
+ {
+ mem[mem.Length-1] = mem.Length-1;
+ }
+ }
+
+ ~BNode()
+ {
+ icFinalNode++;
+ rlNode.Add(this); //resurrect objects
+ }
+ }
+
+
+ internal class CreateObj
+ {
+
+ public BaseFinal mv_Obj;
+
+// disabling unused variable warning
+#pragma warning disable 0414
+ public BNode obj;
+#pragma warning restore 0414
+
+
+ public CreateObj()
+ {
+
+ mv_Obj = new BaseFinal();
+ //Printing GetTotalMemory is commented out so that the test can build on RedHawk
+ //Console.WriteLine("before test started, the heapsize is {0}", GC.GetTotalMemory(false));
+
+ for( int i=1; i< 1000; i++)
+ {
+ obj = new BNode(i); //create new one and delete the last one.
+ mv_Obj.CreateNode( i ); //create locate objects in createNode().
+ }
+ Console.Write(BNode.icCreateNode);
+ Console.WriteLine(" Nodes were created.");
+
+ //Console.WriteLine("after all objects were created, the heapsize is " + GC.GetTotalMemory(false));
+ }
+
+ public bool RunTest()
+ {
+ obj = null;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ Console.Write(BNode.icFinalNode);
+ Console.WriteLine(" Nodes were finalized and resurrected.");
+ //Console.WriteLine("after all objects were deleted and resurrected in Finalize() , the heapsize is " + GC.GetTotalMemory(false));
+
+ for(int i=0; i< BNode.rlNode.Count; i++)
+ {
+ BNode oldNode = (BNode)BNode.rlNode[ i ];
+ if ( oldNode.mem[0] != 99 )
+ {
+ Console.WriteLine( "One Node is not resurrected correctly.");
+ }
+ oldNode = null;
+ BNode.rlNode[ i ] = null;
+ }
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ //Console.WriteLine("after all objects were deleted , the heapsize is " + GC.GetTotalMemory(false));
+
+ return ( BNode.icCreateNode == BNode.icFinalNode );
+
+
+ }
+ }
+
+
+}
diff --git a/tests/src/GC/Scenarios/BaseFinal/basefinal.csproj b/tests/src/GC/Scenarios/BaseFinal/basefinal.csproj
new file mode 100644
index 0000000000..a6b0e5d3e9
--- /dev/null
+++ b/tests/src/GC/Scenarios/BaseFinal/basefinal.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="BaseFinal.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/BinTree/app.config b/tests/src/GC/Scenarios/BinTree/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/BinTree/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/BinTree/bintree.cs b/tests/src/GC/Scenarios/BinTree/bintree.cs
new file mode 100644
index 0000000000..a58dd8f497
--- /dev/null
+++ b/tests/src/GC/Scenarios/BinTree/bintree.cs
@@ -0,0 +1,181 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System.Threading;
+ using System;
+ using System.IO;
+
+ public enum TreeType
+ {
+ Normal,
+ Growing,
+ Living
+ }
+
+ public class Node
+ {
+ internal int m_data;
+ internal Node m_pLeft;
+ internal Node m_pRight;
+ internal byte[] m_aMem;
+ internal bool Switch;
+ internal int m_iCount;
+
+ public Node()
+ {
+ m_aMem = new byte[10];
+ m_aMem[0] = (byte)10;
+ m_aMem[9] = (byte)10;
+ }
+
+ public void Live()
+ {
+ if (Switch)
+ {
+ m_aMem = new byte[1000];
+ m_aMem[0] = (byte) 10;
+ m_aMem[999] = (byte) 10;
+ }
+ else
+ {
+ m_aMem = new byte[10];
+ m_aMem[0] = (byte) 10;
+ m_aMem[9] = (byte) 10;
+ }
+
+ Switch = !Switch;
+ }
+
+ public void Grow()
+ {
+ m_aMem = new byte[(m_iCount+=100)];
+ m_aMem[0] = (byte) 10;
+ m_aMem[m_iCount-1] = (byte) 10;
+ }
+ }
+
+
+ public class BinTree
+ {
+ internal Node m_pRoot;
+ internal Random m_Random;
+ internal TreeType m_TreeType;
+
+ public BinTree(int ThreadId, TreeType treeType)
+ {
+ // the following intended to ensure the console output was legible...
+ //Console.SetOut(TextWriter.Synchronized(Console.Out));
+ m_TreeType = treeType;
+ m_pRoot = null;
+ m_Random = new Random();
+ }
+
+
+ public void Empty (int ThreadId)
+ {
+ Console.Out.WriteLine("Thread " + ThreadId + ": Tree Empty");
+ m_pRoot = null;
+ }
+
+
+ public void AddNodes (int howMany, int ThreadId)
+ {
+ for (int i = 0; i < howMany; i++)
+ {
+ m_pRoot = Insert(m_pRoot, m_Random.Next(100));
+ }
+ Console.Out.WriteLine("Thread " + ThreadId + " Added: " + howMany + " Nodes: " + GC.GetTotalMemory(false));
+ }
+
+
+ public void DeleteNodes (int howMany, int ThreadId)
+ {
+ for (int i = 0; i < howMany; i++)
+ {
+ m_pRoot = Delete(m_pRoot, m_Random.Next(100) );
+ }
+ Console.Out.WriteLine("Thread " + ThreadId +" Deleted: " + howMany + " Nodes: " + GC.GetTotalMemory(false));
+ }
+
+
+ public Node Insert(Node root, int element)
+ {
+ if(root == null) //if is NULL make a new node
+ { //and copy number to the new node
+ root=new Node(); //make new node
+ root.m_data = element; //copy number
+ root.m_pLeft=null ; //set the children to NULL
+ root.m_pRight=null;
+ }
+ else if(element < root.m_data)
+ {
+ root.m_pLeft = Insert(root.m_pLeft, element);
+ }
+ else
+ {
+ root.m_pRight = Insert(root.m_pRight, element);
+ }
+
+ if (m_TreeType==TreeType.Growing)
+ {
+ root.Grow();
+ }
+ else if (m_TreeType==TreeType.Living)
+ {
+ root.Live();
+ }
+
+ return root;
+ }
+
+
+ public Node Delete(Node root, int element)
+ {
+ Node temp = null;
+
+ if (root == null)
+ {
+ return null; //Node not found
+ }
+ else if (element == root.m_data) //if it was the first data (node)
+ {
+ if(root.m_pRight == null) //check if it has right child.
+ { //If it has no right child
+ return root.m_pLeft;
+ }
+
+ if (root.m_pLeft == null)
+ {
+ return root.m_pRight;
+ }
+ else
+ {
+ for (temp = root.m_pLeft; temp.m_pRight != null; temp = temp.m_pRight);
+ root.m_data = temp.m_data;
+ root.m_pLeft = Delete(root.m_pLeft, temp.m_data);
+ }
+ }
+ else if (root.m_data > element)
+ {
+ root.m_pLeft = Delete(root.m_pLeft, element);
+ }
+ else
+ {
+ root.m_pRight = Delete(root.m_pRight, element);
+ }
+
+ if (m_TreeType==TreeType.Growing)
+ {
+ root.Grow();
+ }
+ else if (m_TreeType==TreeType.Living)
+ {
+ root.Live();
+ }
+
+ return root;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/BinTree/bintree.csproj b/tests/src/GC/Scenarios/BinTree/bintree.csproj
new file mode 100644
index 0000000000..8acbccd41d
--- /dev/null
+++ b/tests/src/GC/Scenarios/BinTree/bintree.csproj
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestKind>BuildOnly</CLRTestKind>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="BinTree.cs" />
+ <Compile Include="TreeThread.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/BinTree/thdtree.cs b/tests/src/GC/Scenarios/BinTree/thdtree.cs
new file mode 100644
index 0000000000..126f299a46
--- /dev/null
+++ b/tests/src/GC/Scenarios/BinTree/thdtree.cs
@@ -0,0 +1,50 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**
+ * Description:
+ * Mainly stresses the GC by creating n threads each manipulating its own local binary tree structure.
+ * Each thread in turn adds and deletes thousands of nodes from the binary tree.
+ */
+
+namespace DefaultNamespace {
+ using System.Threading;
+ using System;
+ using System.IO;
+
+ public class ThdTree
+ {
+
+ public static int Main (System.String[] Args)
+ {
+
+ Console.Out.WriteLine("Test should return with ExitCode 100 ...");
+ // sync console output Console.SetOut(TextWriter.Synchronized(Console.Out));
+
+ int iNofThread = 0;
+
+ if (Args.Length == 1)
+ {
+ if (!Int32.TryParse( Args[0], out iNofThread ))
+ {
+ iNofThread = 2;
+ }
+ }
+ else
+ {
+ iNofThread = 2;
+ }
+
+ TreeThread Mv_LLTree;
+
+ int[] count = {10000, -5000, 3000, -6000, 0, 15000, 0, 10000,0,100,100};
+ for (int i = 0; i < iNofThread; i++)
+ {
+ Mv_LLTree = new TreeThread(i, TreeType.Normal, count);
+ }
+ return 100;
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/BinTree/thdtree.csproj b/tests/src/GC/Scenarios/BinTree/thdtree.csproj
new file mode 100644
index 0000000000..3d6ffe3d86
--- /dev/null
+++ b/tests/src/GC/Scenarios/BinTree/thdtree.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="ThdTree.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="BinTree.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/BinTree/thdtreegrowingobj.cs b/tests/src/GC/Scenarios/BinTree/thdtreegrowingobj.cs
new file mode 100644
index 0000000000..206184428e
--- /dev/null
+++ b/tests/src/GC/Scenarios/BinTree/thdtreegrowingobj.cs
@@ -0,0 +1,50 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**
+ * Description:
+ * Mainly stresses the GC by creating n threads each manipulating its own local binary tree.
+ * Differs from thdtree in a way that the nodes of the binary trees grow during the lifetime.
+ */
+
+
+
+namespace DefaultNamespace {
+ using System.Threading;
+ using System;
+ using System.IO;
+
+ public class ThdTreeGrowingObj
+ {
+
+ public static int Main (System.String[] Args)
+ {
+ Console.Out.WriteLine("Test should return with ExitCode 100 ...");
+ // console sync Console.SetOut(TextWriter.Synchronized(Console.Out));
+
+ int iNofThread = 0;
+
+ if (Args.Length == 1)
+ {
+ if (!Int32.TryParse( Args[0], out iNofThread ))
+ {
+ iNofThread = 2;
+ }
+ }
+ else
+ {
+ iNofThread = 2;
+ }
+
+ int[] count = {300, 1000, -350, 0, 71, 200};
+ TreeThread Mv_TreeThread;
+ for (int i = 0; i < iNofThread; i++)
+ {
+ Mv_TreeThread = new TreeThread(i, TreeType.Growing, count); //Each treethread object launches a thread
+ }
+ return 100;
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/BinTree/thdtreegrowingobj.csproj b/tests/src/GC/Scenarios/BinTree/thdtreegrowingobj.csproj
new file mode 100644
index 0000000000..d97506bfea
--- /dev/null
+++ b/tests/src/GC/Scenarios/BinTree/thdtreegrowingobj.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="ThdTreeGrowingObj.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="BinTree.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/BinTree/thdtreelivingobj.cs b/tests/src/GC/Scenarios/BinTree/thdtreelivingobj.cs
new file mode 100644
index 0000000000..6ac0963126
--- /dev/null
+++ b/tests/src/GC/Scenarios/BinTree/thdtreelivingobj.cs
@@ -0,0 +1,49 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**
+ * Description:
+ * Mainly stresses the GC by creating n threads each manipulating its own local binary tree.
+ * Differs from thdtree in a way that the nodes of the binary trees are alive(meaning they
+ * shrink and grow during their lifetime).
+ */
+
+
+namespace DefaultNamespace {
+ using System.Threading;
+ using System;
+ using System.IO;
+
+ public class ThdTreeLivingObj {
+
+ public static int Main (System.String[] Args)
+ {
+ Console.Out.WriteLine("Test should return with ExitCode 100 ...");
+ // console out sync Console.SetOut(TextWriter.Synchronized(Console.Out));
+
+ int iNofThread = 0;
+
+ if (Args.Length == 1)
+ {
+ if (!Int32.TryParse( Args[0], out iNofThread ))
+ {
+ iNofThread = 2;
+ }
+ }
+ else
+ {
+ iNofThread = 2;
+ }
+
+ int[] count = {1000, 1000, 1000, -900, 0, 700, 100};
+ TreeThread Mv_TreeThread;
+ for (int i = 0; i < iNofThread; i++)
+ {
+ Mv_TreeThread = new TreeThread(i, TreeType.Living, count);
+ }
+ return 100;
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/BinTree/thdtreelivingobj.csproj b/tests/src/GC/Scenarios/BinTree/thdtreelivingobj.csproj
new file mode 100644
index 0000000000..8849ad76b9
--- /dev/null
+++ b/tests/src/GC/Scenarios/BinTree/thdtreelivingobj.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="ThdTreeLivingObj.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="BinTree.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/BinTree/treethread.cs b/tests/src/GC/Scenarios/BinTree/treethread.cs
new file mode 100644
index 0000000000..ba14af59a9
--- /dev/null
+++ b/tests/src/GC/Scenarios/BinTree/treethread.cs
@@ -0,0 +1,50 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System.Threading;
+ using System;
+ using System.IO;
+
+ public class TreeThread {
+
+ internal int[] mA_Count;
+ internal int m_id = 0;
+ internal BinTree m_BinTree;
+ internal Thread Mv_Thread;
+
+ public TreeThread(int ThreadId, TreeType treeType, int[] count)
+ {
+ // attempt to synchronize the console output
+ //Console.SetOut(TextWriter.Synchronized(Console.Out));
+
+ mA_Count = count;
+ m_BinTree = new BinTree(ThreadId, treeType);
+ m_id = ThreadId;
+ Mv_Thread = new Thread( new ThreadStart(this.ThreadStart));
+ Mv_Thread.Start( );
+ Console.Out.WriteLine("Started Thread: " + m_id);
+ }
+
+ public void ThreadStart()
+ { //All threads start here
+ for (int i = 0; i < mA_Count.Length; i++)
+ {
+ if (mA_Count[i] == 0)
+ {
+ m_BinTree.Empty(m_id);
+ }
+ else if (mA_Count[i] > 0 )
+ {
+ m_BinTree.AddNodes(mA_Count[i], m_id);
+ }
+ else
+ {
+ m_BinTree.DeleteNodes((mA_Count[i] * -1), m_id);
+ }
+ }
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/Boxing/arrcpy.cs b/tests/src/GC/Scenarios/Boxing/arrcpy.cs
new file mode 100644
index 0000000000..118a5bd227
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/arrcpy.cs
@@ -0,0 +1,58 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System;
+
+ internal class ArrCpy
+ {
+ public static int Main(String [] str)
+ {
+ int iSize = 100;
+ int iRep = 10;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ ArrCpy mv_obj = new ArrCpy();
+ Object [] ObjAry = new Object[iSize];
+ for( int j=0; j< iRep; j++ )
+ {
+ for(int i=0; i< iSize; i++)
+ {
+ if( i==0 )
+ ObjAry[i] = new int[1];
+ else if( i==1 )
+ ObjAry[i] = new Object[i];
+ else
+ ObjAry[i] = mv_obj.CreatAry( i-1, ObjAry );
+ }
+ GC.Collect();
+ }
+ return 100;
+
+ }
+
+
+ public Object CreatAry( int iSize, Object [] ObjAry)
+ {
+ Object [] ary = new Object[iSize];
+ if( ary.Length > 1 )
+ {
+ Array.Copy( ObjAry, ary, ary.Length-2 );
+ if( ary.Length-1 == 1 )
+ {
+ ary[ary.Length-1] = new byte[ary.Length];
+ }
+ else
+ {
+ ary[ary.Length-1] = CreatAry( ary.Length-1, ary );
+ }
+ }
+ else
+ {
+ ary[0] = new Object[0];
+ }
+ return ary;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/Boxing/arrcpy.csproj b/tests/src/GC/Scenarios/Boxing/arrcpy.csproj
new file mode 100644
index 0000000000..8a6b60dae6
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/arrcpy.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="ArrCpy.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Boxing/doubLink.csproj b/tests/src/GC/Scenarios/Boxing/doubLink.csproj
index baebb0562f..28d5fc98c1 100644
--- a/tests/src/GC/Scenarios/Boxing/doubLink.csproj
+++ b/tests/src/GC/Scenarios/Boxing/doubLink.csproj
@@ -32,8 +32,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Scenarios/Boxing/gcvariant.cs b/tests/src/GC/Scenarios/Boxing/gcvariant.cs
new file mode 100644
index 0000000000..445c70fc25
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/gcvariant.cs
@@ -0,0 +1,205 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace GCVariant {
+ using System;
+
+ internal class GCVariant
+ {
+
+ internal static object [] G_Vart;
+
+ public static int Main(String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+ int iNum = 0;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 5;
+ }
+ iObj = 100;
+ iNum = 10;
+ break;
+
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 5;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 100;
+ }
+ iNum = 10;
+ break;
+
+ case 3:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 5;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 100;
+ }
+ if (!Int32.TryParse( Args[2], out iNum ))
+ {
+ iNum = 10;
+ }
+ break;
+
+ default:
+ iRep = 5;
+ iObj = 100;
+ iNum = 10;
+ break;
+ }
+
+
+ Console.Write("iRep= ");
+ Console.Write(iRep);
+ Console.Write(" iObj= ");
+ Console.Write(iObj);
+ Console.Write(" iNum= ");
+ Console.WriteLine(iNum);
+
+ GCVariant Mv_Obj = new GCVariant();
+
+ if(Mv_Obj.runTest(iRep, iObj, iNum ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+
+ public bool runTest(int iRep, int iObj, int iNum)
+ {
+ DoubLink L_Node1 = new DoubLink(iNum);
+ DLinkNode L_Node2 = new DLinkNode(iNum, null, null);
+
+ for(int i= 0; i< iRep; i++)
+ {
+ G_Vart = new Object[iObj];
+ for(int j=0; j< iObj; j++)
+ {
+ if(j%2 == 1)
+ G_Vart[j] = (L_Node1);
+ else
+ G_Vart[j] = (L_Node2);
+ }
+ MakeLeak(iRep, iObj, iNum);
+
+ }
+ return true;
+ }
+
+
+ public void MakeLeak(int iRep, int iObj, int iNum)
+ {
+ DoubLink L_Node1 = new DoubLink(iNum);
+ DLinkNode L_Node2 = new DLinkNode(iNum, null, null);
+ Object [] L_Vart1 = new Object[iObj];
+ Object [] L_Vart2;
+
+ for(int i= 0; i< iRep; i++)
+ {
+ L_Vart2 = new Object[iObj];
+ for(int j=0; j< iObj; j++)
+ {
+ if(j%2 == 1)
+ {
+ L_Vart1[j] = (j);
+ L_Vart2[j] = ((double)j);
+ }
+ else
+ {
+ L_Vart2[j] = (L_Node2);
+ L_Vart1[j] = (L_Node1);
+ }
+ }
+ }
+ }
+ }
+
+ public class DoubLink
+ {
+ internal DLinkNode[] Mv_DLink;
+
+ public DoubLink(int Num)
+ : this(Num, false)
+ {
+ }
+
+ public DoubLink(int Num, bool large)
+ {
+
+ Mv_DLink = new DLinkNode[Num];
+
+ if (Num == 0)
+ {
+ return;
+ }
+
+ if (Num == 1)
+ {
+ // only one element
+ Mv_DLink[0] = new DLinkNode((large ? 256 : 1), Mv_DLink[0], Mv_DLink[0]);
+ return;
+ }
+
+ // first element
+ Mv_DLink[0] = new DLinkNode((large ? 256 : 1), Mv_DLink[Num - 1], Mv_DLink[1]);
+
+ // all elements in between
+ for (int i = 1; i < Num - 1; i++)
+ {
+ Mv_DLink[i] = new DLinkNode((large ? 256 : i + 1), Mv_DLink[i - 1], Mv_DLink[i + 1]);
+ }
+
+ // last element
+ Mv_DLink[Num - 1] = new DLinkNode((large ? 256 : Num), Mv_DLink[Num - 2], Mv_DLink[0]);
+ }
+
+
+ public int NodeNum
+ {
+ get
+ {
+ return Mv_DLink.Length;
+ }
+ }
+
+
+ }
+
+ public class DLinkNode
+ {
+ // disabling unused variable warning
+#pragma warning disable 0414
+ internal DLinkNode Last;
+ internal DLinkNode Next;
+#pragma warning restore 0414
+
+ internal int[] Size;
+
+ public DLinkNode(int SizeNum, DLinkNode LastObject, DLinkNode NextObject)
+ {
+ Last = LastObject;
+ Next = NextObject;
+ Size = new int[SizeNum * 1024];
+ Size[0] = 1;
+ Size[SizeNum * 1024 - 1] = 2;
+ }
+ }
+
+}
diff --git a/tests/src/GC/Scenarios/Boxing/gcvariant.csproj b/tests/src/GC/Scenarios/Boxing/gcvariant.csproj
new file mode 100644
index 0000000000..5df120160d
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/gcvariant.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="GCVariant.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Boxing/gcvariant2.cs b/tests/src/GC/Scenarios/Boxing/gcvariant2.cs
new file mode 100644
index 0000000000..1c126a80ef
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/gcvariant2.cs
@@ -0,0 +1,112 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**************************************************************
+/*This tests covered asigning all basic types to Objects
+/*Delete the reference of Varaints from Object arrays/Object
+/*to see if GC can work fine with them. The most of Object Object's
+/*lifetime is shorter than theirs in GCObject3.
+/**************************************************************/
+
+namespace DefaultNamespace {
+ using System;
+
+ internal class GCVariant2
+ {
+ internal Object [] G_Vart;
+ public static int Main(String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ switch( Args.Length )
+ {
+ case 1:
+ Int32.TryParse( Args[0], out iRep);
+ goto default;
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep))
+ {
+ goto default;
+ }
+ Int32.TryParse( Args[1], out iObj);
+ goto default;
+ default:
+ if (iRep == 0)
+ iRep = 10;
+ if (iObj == 0)
+ iObj = 40000;
+ break;
+ }
+
+ Console.Write("iRep= ");
+ Console.Write(iRep);
+ Console.Write(" ; iObj= ");
+ Console.WriteLine(iObj);
+
+ GCVariant2 Mv_Obj = new GCVariant2();
+ if(Mv_Obj.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+ Object TmpV;
+
+ for(int i= 0; i< iRep; i++)
+ {
+ G_Vart = new Object[iObj];
+ for(int j=0; j< iObj; j++)
+ {
+ switch(j%8)
+ {
+ case 0:
+ G_Vart[j] = (j);
+ TmpV = (j);
+ break;
+ case 1:
+ G_Vart[j] = (true);
+ TmpV = (false);
+ break;
+ case 2:
+ G_Vart[j] = ((float)j/3);
+ TmpV = ((float)j/3);
+ break;
+ case 3:
+ G_Vart[j] = ((byte)j);
+ TmpV = ((byte)j);
+ break;
+ case 4:
+ G_Vart[j] = ((short)j);
+ TmpV = ((short)j);
+ break;
+ case 5:
+ G_Vart[j] = ((long)j);
+ TmpV = ((long)j);
+ break;
+ case 6:
+ G_Vart[j] = ((double)j/0.33);
+ TmpV = ((double)j/0.33);
+ break;
+ case 7:
+ G_Vart[j] = ((char)j);
+ TmpV = ((char)j);
+ break;
+
+ }
+ }
+ GC.Collect();
+ }
+ return true;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/Boxing/gcvariant2.csproj b/tests/src/GC/Scenarios/Boxing/gcvariant2.csproj
new file mode 100644
index 0000000000..cc533d82f2
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/gcvariant2.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="GCVariant2.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Boxing/gcvariant3.cs b/tests/src/GC/Scenarios/Boxing/gcvariant3.cs
new file mode 100644
index 0000000000..8382cd0609
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/gcvariant3.cs
@@ -0,0 +1,156 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**************************************************************
+/*This tests covered asigning all basic types to Variants
+/*and converting Variants to basic types. Delete the reference
+/*of Varaints from Variant arrays to see if GC can work fine
+/*with them. Because this test using Variant to save Variant
+/*the Variant Object's life time is longer than theirs in GCVariant2
+/**************************************************************/
+
+namespace DefaultNamespace {
+ using System;
+
+ internal class GCVariant3
+ {
+
+// disabling unused variable warning
+#pragma warning disable 0414
+ internal Object [] G_Vart1;
+ internal Object [] G_Vart2;
+ internal Object [] G_Vart3;
+ internal Object [] G_Vart4;
+ internal Object [] G_Vart5;
+ internal Object [] G_Vart6;
+#pragma warning restore 0414
+
+ public static int Main(String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ switch( Args.Length )
+ {
+ case 1:
+ Int32.TryParse( Args[0], out iRep);
+ goto default;
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep))
+ {
+ goto default;
+ }
+ Int32.TryParse( Args[1], out iObj);
+ goto default;
+ default:
+ if (iRep == 0)
+ iRep = 10;
+ if (iObj == 0)
+ iObj = 40000;
+ break;
+ }
+
+ Console.Write("iRep= ");
+ Console.Write(iRep);
+ Console.Write(" ; iObj= ");
+ Console.WriteLine(iObj );
+ GCVariant3 Mv_Obj = new GCVariant3();
+ if(Mv_Obj.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+ public bool runTest(int iRep, int iObj)
+ {
+
+ G_Vart2 = new Object[iObj];
+ G_Vart3 = new Object[iObj];
+ G_Vart4 = new Object[iObj];
+ G_Vart5 = new Object[iObj];
+
+ int iTmp;
+ bool bTmp;
+ long lTmp;
+ double dTmp;
+ byte btTmp;
+ short sTmp;
+ char cTmp;
+ float fTmp;
+ for(int i= 0; i< iRep; i++)
+ {
+ G_Vart1 = new Object[iObj];
+ G_Vart6 = new Object[iObj];
+ for(int j=0; j< iObj; j++)
+ {
+ switch(j%8)
+ {
+ case 0:
+ G_Vart1[j] = (j);
+ G_Vart2[j] = ((char)j);
+ iTmp = (int)G_Vart1[j];
+ G_Vart3[j] = (iTmp);
+
+ break;
+ case 1:
+ G_Vart1[j] = (true);
+ G_Vart2[j]= ((double)j/0.33);
+ bTmp = (bool)G_Vart1[j] ;
+ G_Vart3[j] = (bTmp);
+
+ break;
+ case 2:
+ G_Vart1[j] = ((float)j/3);
+ G_Vart2[j] = ((long)j);
+ fTmp = (float)G_Vart1[j] ;
+ G_Vart3[j] = (fTmp);
+ break;
+ case 3:
+ G_Vart1[j] = ((byte)j);
+ G_Vart2[j] = ((short)j);
+ btTmp = (byte)G_Vart1[j] ;
+ G_Vart3[j] = (btTmp);
+ break;
+ case 4:
+ G_Vart1[j] = ((short)j);
+ char[] carr= new char[1];
+ carr[0] = (char)j;
+ G_Vart2[j] = new string(carr);
+ sTmp = (short)G_Vart1[j] ;
+ G_Vart3[j] = (sTmp);
+ break;
+ case 5:
+ G_Vart1[j] = ((long)j);
+ G_Vart2[j] = ((double)j/0.33);;
+ lTmp = (long)G_Vart1[j] ;
+ G_Vart3[j] = (lTmp);
+ break;
+ case 6:
+ G_Vart1[j] = ((double)j/0.33);
+ G_Vart2[j] = ((char)j);
+ dTmp = (double)G_Vart1[j] ;
+ G_Vart3[j] = (dTmp);
+ break;
+ case 7:
+ G_Vart1[j] = ((char)j);
+ G_Vart2[j] = ((float)j/3);
+ cTmp = (char)G_Vart1[j] ;
+ G_Vart3[j] = (cTmp);
+ break;
+
+ }
+
+ }
+ GC.Collect();
+ }
+ return true;
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/Boxing/gcvariant3.csproj b/tests/src/GC/Scenarios/Boxing/gcvariant3.csproj
new file mode 100644
index 0000000000..a53ea2b8fe
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/gcvariant3.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="GCVariant3.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Boxing/gcvariant4.cs b/tests/src/GC/Scenarios/Boxing/gcvariant4.cs
new file mode 100644
index 0000000000..6943c4b112
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/gcvariant4.cs
@@ -0,0 +1,142 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**************************************************************
+/*This tests' porpuse is to test GC with local Object objects
+/*This tests covered asigning all basic types to Objects
+/*and converting Objects to basic types. Delete the reference
+/*of Objects from Object arrays and make local objects of Object
+/*in MakeLeak() see if GC can work fine
+/**************************************************************/
+
+namespace DefaultNamespace {
+ using System;
+
+ internal class GCVariant4
+ {
+ internal Object [] G_Vart1;
+ internal Object [] G_Vart3;
+
+ public static int Main(String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ switch( Args.Length )
+ {
+ case 1:
+ Int32.TryParse( Args[0], out iRep);
+ goto default;
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep))
+ {
+ goto default;
+ }
+ Int32.TryParse( Args[1], out iObj);
+ goto default;
+ default:
+ if (iRep == 0)
+ iRep = 10;
+ if (iObj == 0)
+ iObj = 400;
+ break;
+ }
+
+ Console.Write("iRep= ");
+ Console.Write(iRep);
+ Console.Write(" ; iObj= ");
+ Console.WriteLine(iObj);
+
+ GCVariant4 Mv_Obj = new GCVariant4();
+ if(Mv_Obj.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+ G_Vart3 = new Object[iObj];
+
+ for(int i= 0; i< iRep; i++)
+ {
+ G_Vart1 = new Object[iObj];
+ for(int j=0; j< iObj; j++)
+ {
+ switch(j%8)
+ {
+ case 0:
+ G_Vart1[j] = (j);
+ G_Vart3[j] = (int)(G_Vart1[j]);
+
+ break;
+ case 1:
+ G_Vart1[j] = (true);
+ G_Vart3[j] = (bool)(G_Vart1[j]);
+
+ break;
+ case 2:
+ G_Vart1[j] = ((float)j/3);
+ G_Vart3[j] = (float)(G_Vart1[j]);
+ break;
+ case 3:
+ G_Vart1[j] = ((byte)j);
+ G_Vart3[j] = (byte)(G_Vart1[j]);
+ break;
+ case 4:
+ G_Vart1[j] = ((short)j);
+ G_Vart3[j] = (short)(G_Vart1[j]);
+ break;
+ case 5:
+ G_Vart1[j] = ((long)j);
+ G_Vart3[j] = (long)(G_Vart1[j]);
+ break;
+ case 6:
+ G_Vart1[j] = ((double)j/0.33);
+ G_Vart3[j] = (double)(G_Vart1[j]);
+ break;
+ case 7:
+ G_Vart1[j] = ((char)j);
+ G_Vart3[j] = (char)(G_Vart1[j]);
+ break;
+
+ }
+ MakeLeak(j);
+ }
+ GC.Collect();
+
+ }
+
+ return true;
+ }
+
+
+ public void MakeLeak(int value)
+ {
+ int iTmp = value;
+ bool bTmp = true;
+ long lTmp = (long)value;
+ double dTmp = (double)value*0.0035;
+ byte btTmp = (byte)value;
+ short sTmp = (short)value;
+ char cTmp = (char)value;
+ float fTmp = (float)value/99;
+ Object V1 = (iTmp);
+ Object V2 = (bTmp);
+ Object V3 = (lTmp);
+ Object V4 = (dTmp);
+ Object V5 = (btTmp);
+ Object V6 = (sTmp);
+ Object V7 = (cTmp);
+ Object V8 = (fTmp);
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/Boxing/gcvariant4.csproj b/tests/src/GC/Scenarios/Boxing/gcvariant4.csproj
new file mode 100644
index 0000000000..9aa256bb9b
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/gcvariant4.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="GCVariant4.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Boxing/project.json b/tests/src/GC/Scenarios/Boxing/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Scenarios/Boxing/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Scenarios/Boxing/simpvariant.cs b/tests/src/GC/Scenarios/Boxing/simpvariant.cs
new file mode 100644
index 0000000000..6d703e53cb
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/simpvariant.cs
@@ -0,0 +1,97 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Basic Object Test that uses tests the following types:
+// int
+// long
+// String
+// float
+// as Objects. This is very Basic - uses arrays of 500 and if it does not crash
+// that is a valid test pass.
+//
+
+
+namespace DefaultNamespace {
+ using System;
+
+ public class SimpObject
+ {
+ public static int Main ()
+ {
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ SimpObject sv = new SimpObject( );
+ sv.RunTest( );
+ return 100;
+ }
+
+ public void RunTest()
+ {
+ int Size = 500;
+
+ Console.WriteLine( "Simple Object GC Test" );
+ Console.WriteLine( "Starting int & String Test..." );
+
+ Object [] tempArray = new Object[ Size ];
+
+ for( int i = 0; i < Size; i++ )
+ {
+ if( i % 2 == 1 )
+ {
+ tempArray[i] = i;
+ }
+ else
+ {
+ char[] carr = new char[1];
+ carr[0] = (char)i;
+ tempArray[i] = new string(carr);
+ }
+
+ GC.Collect( );
+ }
+
+ tempArray = null;
+
+ GC.Collect( );
+
+ Console.WriteLine( "int & String Test Complete." );
+ Console.WriteLine();
+ Console.WriteLine( "Starting float, long, & String Test..." );
+
+ tempArray = new Object[ Size ];
+
+ for( int i = 0; i < Size; i++ )
+ {
+ if( i % 2 == 1 )
+ {
+
+ if( i < Size / 2 )
+ {
+ float foo = i;
+ tempArray[ i ] = foo;
+ }
+ else
+ {
+ long foo = i;
+ tempArray[ i ] = foo;
+ }
+ }
+ else
+ {
+ char[] carr = new char[1];
+ carr[0] = (char)i;
+ tempArray[i] = new string(carr);
+ }
+
+ GC.Collect( );
+ }
+
+ tempArray = null;
+
+ GC.Collect( );
+
+ Console.WriteLine( "float, long, & String Test complete." );
+
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/Boxing/simpvariant.csproj b/tests/src/GC/Scenarios/Boxing/simpvariant.csproj
new file mode 100644
index 0000000000..81166fc00c
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/simpvariant.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="SimpVariant.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Boxing/vararystress.cs b/tests/src/GC/Scenarios/Boxing/vararystress.cs
new file mode 100644
index 0000000000..47da06ae9f
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/vararystress.cs
@@ -0,0 +1,75 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**************************************************************/
+/* Test: VarAryStress
+/* Coverage: Test GC and Variant Array
+/* What: Use SetVarAry method that calls himself to generate
+/* Variant array elements. The elements are Variant arrays whose
+/* elememts also are Variant array. iRep is the max embeded level
+/* number of these Variant array. Check out if GC can handle these
+/* objects
+/**************************************************************/
+
+namespace DefaultNamespace {
+ using System;
+
+ internal class VarAryStress
+ {
+ public static int Main( String [] args )
+ {
+ int iRep = 20;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ if( args.Length > 0 )
+ {
+ try
+ {
+ iRep = Int32.Parse( args[0] );
+ }
+ catch(FormatException )
+ {
+ Console.WriteLine("FormatException is caught");
+ }
+ }
+
+ Object [] VarAry = new Object[1];
+ VarAryStress mv_obj = new VarAryStress();
+ for(int i=0; i< iRep; i++ )
+ {
+ if( i>1 )
+ {
+ VarAry[0] = mv_obj.SetVarAry( i-1 );
+ }
+ else
+ {
+ VarAry[0] = i;
+ }
+ if( i%5 == 0)
+ {
+ GC.Collect();
+ // Console.WriteLine( "HeapSize after GC: {0}", GC.GetTotalMemory(false) );
+ }
+
+ }
+
+ Console.WriteLine( "Test Passed" );
+ return 100;
+ }
+
+ public Object SetVarAry( int iSize )
+ {
+ Object [] vary= new Object[2];
+ for( int i=0; i< iSize; i++ )
+ {
+ if( i > 1 )
+ vary[0] = SetVarAry( i-1 );
+ else
+ vary[1] = i;
+ }
+ return vary;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/Boxing/vararystress.csproj b/tests/src/GC/Scenarios/Boxing/vararystress.csproj
new file mode 100644
index 0000000000..2a111f4d98
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/vararystress.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="VarAryStress.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Boxing/variantint.cs b/tests/src/GC/Scenarios/Boxing/variantint.cs
new file mode 100644
index 0000000000..03e12f361c
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/variantint.cs
@@ -0,0 +1,94 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**
+ * Description:
+ * A Test which tests the GC using Variants. It is a test which creates a bunch of Variant Objects
+ * with mainly INT datatype.
+*/
+
+namespace DefaultNamespace {
+ using System;
+
+ internal class VariantInt
+ {
+
+ internal Object [] m_aVar;
+ internal Object [] m_aVar1;
+
+ public static int Main(String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ if (Args.Length==2)
+ {
+ if (!Int32.TryParse( Args[0], out iRep ) ||
+ !Int32.TryParse( Args[0], out iObj ))
+ {
+ iRep = 20;
+ iObj = 100;
+ }
+ }
+ else
+ {
+ iRep = 20;
+ iObj = 100;
+ }
+
+ VariantInt Mv_Obj = new VariantInt();
+ if(Mv_Obj.runTest(iRep, iObj))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+ for(int i = 0; i < iRep; i++)
+ {
+ m_aVar = new Object[iObj];
+ for(int j = 0; j < iObj; j++)
+ {
+ if(j%2 == 1)
+ {
+ m_aVar[j] = i;
+ }
+ else
+ {
+ m_aVar[j] = null;
+ }
+ }
+ MakeLeak(iRep, iObj);
+ Console.WriteLine(i);
+ }
+ return true;
+ }
+
+
+ public void MakeLeak(int iRep, int iObj)
+ {
+ Object [] L_Vart1 = new Object[iObj];
+ Object [] L_Vart2;
+ m_aVar1 = new Object[iObj];
+ for(int i = 0; i < iRep; i++)
+ {
+ L_Vart2 = new Object[iObj];
+ for(int j=0; j< iObj; j++)
+ {
+ L_Vart1[j] = m_aVar[j];
+ L_Vart2[j] = (m_aVar[j]);
+ m_aVar1[j] = (new int[10]);
+ m_aVar1[j] = (m_aVar[j]);
+ }
+ }
+ m_aVar1 = null;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/Boxing/variantint.csproj b/tests/src/GC/Scenarios/Boxing/variantint.csproj
new file mode 100644
index 0000000000..4b06f35ad2
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/variantint.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="VariantInt.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Boxing/variantlinklist.cs b/tests/src/GC/Scenarios/Boxing/variantlinklist.cs
new file mode 100644
index 0000000000..7801d2a287
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/variantlinklist.cs
@@ -0,0 +1,106 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**
+ * Description:
+ * Mainly stresses the GC by creating a link list of Variants. A large number
+ * of nodes are created and leaks generated by traversing the link list and changing
+ * the variant objects in the nodes
+ */
+
+
+namespace DefaultNamespace {
+ using System;
+
+ internal class Node
+ {
+// disabling unused variable warning
+#pragma warning disable 0414
+ internal Object m_Var;
+#pragma warning restore 0414
+
+ internal Object [] m_aVar;
+ internal Node next;
+
+ public Node()
+ {
+ m_aVar = new Object[10];
+ m_aVar[0] = 10;
+ m_aVar[1] = ("ABC");
+ }
+ }
+
+ internal class VariantLinkList
+ {
+ internal Node m_Root;
+
+ public static int Main(String [] Args){
+ int iRep = 0;
+ int iObj = 0;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ if (Args.Length==2)
+ {
+ if (!Int32.TryParse( Args[0], out iRep ) ||
+ !Int32.TryParse( Args[0], out iObj ))
+ {
+ iRep = 40000;
+ iObj = 100;
+ }
+ }
+ else
+ {
+ iRep = 40000;
+ iObj = 100;
+ }
+
+ VariantLinkList Mv_Obj = new VariantLinkList();
+ if(Mv_Obj.runTest(iRep, iObj))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+ public bool runTest(int iRep, int iObj)
+ {
+ m_Root = new Node();
+ m_Root.m_Var = null;
+ m_Root.next = null;
+ Node temp = m_Root;
+ for(int i = 0; i < iRep; i++)
+ {
+ temp.next = new Node();
+ temp = temp.next;
+ temp.m_Var = (i);
+ temp.next = null;
+ if ((i+1)%10000 == 0)
+ {
+ Console.Write("Nodes Created: ");
+ Console.WriteLine(i+1);
+ }
+ }
+ temp = m_Root;
+ m_Root = null;
+
+ Console.WriteLine("Done creating");
+
+ for(int i = 0; i < iRep; i++)
+ {
+ temp = temp.next;
+ if ((i+1)%10000 == 0)
+ {
+ Console.Write("Nodes Traversed: ");
+ Console.WriteLine(i + 1);
+ GC.Collect();
+ }
+ }
+ GC.Collect();
+ return true;
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/Boxing/variantlinklist.csproj b/tests/src/GC/Scenarios/Boxing/variantlinklist.csproj
new file mode 100644
index 0000000000..f0575ce347
--- /dev/null
+++ b/tests/src/GC/Scenarios/Boxing/variantlinklist.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="VariantLinkList.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/DoublinkList/DoubLink.csproj b/tests/src/GC/Scenarios/DoublinkList/DoubLink.csproj
index 8d6a154cbc..607604637d 100644
--- a/tests/src/GC/Scenarios/DoublinkList/DoubLink.csproj
+++ b/tests/src/GC/Scenarios/DoublinkList/DoubLink.csproj
@@ -32,8 +32,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Scenarios/DoublinkList/DoubLink_V2.csproj b/tests/src/GC/Scenarios/DoublinkList/DoubLink_V2.csproj
index baebb0562f..28d5fc98c1 100644
--- a/tests/src/GC/Scenarios/DoublinkList/DoubLink_V2.csproj
+++ b/tests/src/GC/Scenarios/DoublinkList/DoubLink_V2.csproj
@@ -32,8 +32,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Scenarios/DoublinkList/dlbigleak.cs b/tests/src/GC/Scenarios/DoublinkList/dlbigleak.cs
new file mode 100644
index 0000000000..c72c8c089c
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/dlbigleak.cs
@@ -0,0 +1,199 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/******************************************************************
+/*Test case for testing GC with cyclic double linked list leaks
+/*It's based on DoubLinkGen, the deference is its base node has 1MB
+/*memory, the nodes number inside of every cyclic double linked list
+/*is iObj.
+/******************************************************************/
+
+
+namespace DoubLink {
+ using System;
+
+ public class DLBigLeak
+ {
+ internal DoubLink[] Mv_Doub;
+
+ public static int Main(System.String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 5;
+ }
+ break;
+
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 5;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 30;
+ }
+ break;
+
+ default:
+ iRep = 5;
+ iObj = 30;
+ break;
+
+ }
+
+ DLBigLeak Mv_Leak = new DLBigLeak();
+ if(Mv_Leak.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+ Mv_Doub = new DoubLink[iRep];
+ for(int i=0; i<10; i++)
+ {
+ SetLink(iRep, iObj);
+ MakeLeak(iRep);
+ GC.Collect();
+ }
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ Console.Write(DLinkNode.FinalCount);
+ Console.WriteLine(" DLinkNodes finalized");
+ return (DLinkNode.FinalCount==iRep*iObj*10);
+ }
+
+
+ public void SetLink(int iRep, int iObj)
+ {
+
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Doub[0] = new DoubLink(iObj, true);
+ GC.Collect();
+ }
+
+ }
+
+
+ public void MakeLeak(int iRep)
+ {
+
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Doub[i] = null;
+ }
+
+ }
+
+ }
+
+ public class DoubLink
+ {
+ internal DLinkNode[] Mv_DLink;
+
+ public DoubLink(int Num)
+ : this(Num, false)
+ {
+ }
+
+ public DoubLink(int Num, bool large)
+ {
+
+ Mv_DLink = new DLinkNode[Num];
+
+ if (Num == 0)
+ {
+ return;
+ }
+
+ if (Num == 1)
+ {
+ // only one element
+ Mv_DLink[0] = new DLinkNode((large ? 250 : 1), Mv_DLink[0], Mv_DLink[0]);
+ return;
+ }
+
+ // first element
+ Mv_DLink[0] = new DLinkNode((large ? 250 : 1), Mv_DLink[Num - 1], Mv_DLink[1]);
+
+ // all elements in between
+ for (int i = 1; i < Num - 1; i++)
+ {
+ Mv_DLink[i] = new DLinkNode((large ? 250 : i + 1), Mv_DLink[i - 1], Mv_DLink[i + 1]);
+ }
+
+ // last element
+ Mv_DLink[Num - 1] = new DLinkNode((large ? 250 : Num), Mv_DLink[Num - 2], Mv_DLink[0]);
+ }
+
+
+ public int NodeNum
+ {
+ get
+ {
+ return Mv_DLink.Length;
+ }
+ }
+
+
+ public DLinkNode this[int index]
+ {
+ get
+ {
+ return Mv_DLink[index];
+ }
+
+ set
+ {
+ Mv_DLink[index] = value;
+ }
+ }
+
+ }
+
+ public class DLinkNode
+ {
+ // disabling unused variable warning
+#pragma warning disable 0414
+ internal DLinkNode Last;
+ internal DLinkNode Next;
+ internal int[] Size;
+#pragma warning restore 0414
+
+ public static int FinalCount = 0;
+
+ public DLinkNode(int SizeNum, DLinkNode LastObject, DLinkNode NextObject)
+ {
+ Last = LastObject;
+ Next = NextObject;
+ Size = new int[SizeNum * 1024];
+ }
+
+ ~DLinkNode()
+ {
+ FinalCount++;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/DoublinkList/dlbigleak.csproj b/tests/src/GC/Scenarios/DoublinkList/dlbigleak.csproj
new file mode 100644
index 0000000000..fa08252434
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/dlbigleak.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="dLBigleak.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.cs b/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.cs
new file mode 100644
index 0000000000..f1a322a2bf
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.cs
@@ -0,0 +1,149 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/******************************************************************
+/*Test case for testing GC with cyclic double linked list leaks
+/*It's based on DoubLinkGen, the deference is its base node has 1MB
+/*memory, the nodes number inside of every cyclic double linked list
+/*is iObj.
+/******************************************************************/
+
+namespace DoubLink {
+ using System.Threading;
+ using System;
+ using System.IO;
+
+ public class DLBigLeakThd
+ {
+ internal DoubLink []Mv_Doub;
+ internal int iRep = 0;
+ internal int iObj = 0;
+
+ public static int Main(System.String [] Args)
+ {
+ DLBigLeakThd Mv_Leak = new DLBigLeakThd();
+
+ int iRep = 0;
+ int iObj = 0;
+ int iThd = 0;
+ Console.Out.WriteLine("Test should return with ExitCode 100 ...");
+ //Console.SetOut(TextWriter.Synchronized(Console.Out));
+
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 1;
+ }
+ break;
+
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 1;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 20;
+ }
+ break;
+
+ case 3:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 1;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 20;
+ }
+ if (!Int32.TryParse( Args[2], out iThd ))
+ {
+ iThd = 2;
+ }
+ break;
+
+ default:
+ iRep = 1;
+ iObj = 20;
+ iThd = 2;
+ break;
+ }
+
+ if (Mv_Leak.runTest(iRep, iObj, iThd ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+
+ }
+
+
+ public bool runTest(int iRep, int iObj, int iThd)
+ {
+ this.iRep = iRep;
+ this.iObj = iObj;
+ Mv_Doub = new DoubLink[iRep];
+ Thread [] Mv_Thread = new Thread[iThd];
+ for(int i=0; i<iThd; i++)
+ {
+ Mv_Thread[i] = new Thread(new ThreadStart(this.ThreadStart));
+ Mv_Thread[i].Start( );
+ }
+ for(int i=0; i<20; i++)
+ {
+ SetLink(iRep, iObj);
+ MakeLeak(iRep);
+ }
+ for(int i=0; i<iThd; i++)
+ {
+ Mv_Thread[i].Join();
+ }
+
+ Mv_Doub = null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ int goal = iRep*15*iThd*iObj+20*iRep*iObj;
+ Console.WriteLine("{0}/{1} DLinkNodes finalized", DLinkNode.FinalCount, goal);
+ return (DLinkNode.FinalCount==goal);
+ }
+
+
+ public void SetLink(int iRep, int iObj)
+ {
+
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Doub[i] = new DoubLink(iObj, true);
+ }
+ GC.Collect();
+ }
+
+
+ public void MakeLeak(int iRep)
+ {
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Doub[i] = null;
+ }
+ GC.Collect();
+ }
+
+
+ public void ThreadStart()
+ {
+ for(int i=0; i<15; i++)
+ {
+ SetLink(iRep, iObj);
+ MakeLeak(iRep);
+ }
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.csproj b/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.csproj
new file mode 100644
index 0000000000..47b60408d1
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="DLBigLeakThd.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="DoubLink.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd_v2.csproj b/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd_v2.csproj
new file mode 100644
index 0000000000..51b606c677
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/dlbigleakthd_v2.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="dLBigLeakThd.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="DoubLink.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/DoublinkList/dlcollect.cs b/tests/src/GC/Scenarios/DoublinkList/dlcollect.cs
new file mode 100644
index 0000000000..a3a0c53dac
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/dlcollect.cs
@@ -0,0 +1,104 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**************************************************************
+/* a test case based on DoubLinkStay. Instead of saving references
+/* into array, it save them into List<object>
+/* to see if GC can handle Collections references correctly.
+/**************************************************************/
+
+namespace DoubLink {
+ using System;
+ using System.Collections.Generic;
+
+ public class DLCollect
+ {
+
+ internal DoubLink []Mv_Doub;
+ internal List<DoubLink> Mv_Collect;
+
+ public static int Main(String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 20;
+ }
+ break;
+
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 20;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 10;
+ }
+ break;
+
+ default:
+ iRep = 20;
+ iObj = 10;
+ break;
+
+ }
+
+ DLCollect Mv_Leak = new DLCollect();
+ if(Mv_Leak.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+
+ Mv_Collect = new List<DoubLink>(iRep);
+ for(int i=0; i <10; i++)
+ {
+ SetLink(iRep, iObj);
+ Mv_Collect.RemoveRange(0, Mv_Collect.Count);
+ GC.Collect();
+ }
+
+ GC.WaitForPendingFinalizers();
+
+ Console.WriteLine("{0} DLinkNodes finalized", DLinkNode.FinalCount);
+ return (DLinkNode.FinalCount==iRep*iObj*10);
+ }
+
+
+ public void SetLink(int iRep, int iObj)
+ {
+ Mv_Doub = new DoubLink[iRep];
+
+ for(int i=0; i<iRep; i++)
+ {
+ // create DoubLink element in array
+ Mv_Doub[i] = new DoubLink(iObj);
+
+ // add DoubLink element to List<object>
+ Mv_Collect.Add(Mv_Doub[i]);
+
+ // kill reference to DoubLink in array
+ Mv_Doub[i] = null;
+ }
+
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/DoublinkList/dlcollect.csproj b/tests/src/GC/Scenarios/DoublinkList/dlcollect.csproj
new file mode 100644
index 0000000000..268a91b3a2
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/dlcollect.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="DLCollect.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="DoubLink.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/DoublinkList/dlstack.cs b/tests/src/GC/Scenarios/DoublinkList/dlstack.cs
new file mode 100644
index 0000000000..5aea9586c4
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/dlstack.cs
@@ -0,0 +1,120 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**************************************************************
+/* a test case based on DoubLinkStay. Instead of delete all of
+/* the reference to a Cyclic Double linked list, it creats one
+/* reference to the first node of the linked list and save it in
+/* a local array in SetLink, then delete all old reference. To
+/* check if GC collects leak when the local array out of stack.
+/**************************************************************/
+
+namespace DoubLink {
+
+ using System;
+
+ public class DLStack
+ {
+
+ internal DoubLink[] Mv_Doub;
+ internal int n_count = 0;
+
+ public static int Main(System.String [] Args)
+ {
+ int iRep = 100;
+ int iObj = 10;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 100;
+ }
+ break;
+
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 100;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 10;
+ }
+ break;
+
+ default:
+ iRep = 100;
+ iObj = 10;
+ break;
+ }
+
+ DLStack Mv_Leak = new DLStack();
+ if(Mv_Leak.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+
+ for(int i=0; i <10; i++)
+ {
+ SetLink(iRep, iObj);
+ MakeLeak(iRep);
+ }
+
+ long lastTotalMemory = long.MaxValue;
+ long curTotalMemory = GC.GetTotalMemory(false);
+
+ while (lastTotalMemory != curTotalMemory)
+ {
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ lastTotalMemory = curTotalMemory;
+ curTotalMemory = GC.GetTotalMemory(false);
+ }
+
+ Console.WriteLine("{0} DLinkNodes finalized", DLinkNode.FinalCount);
+ return (DLinkNode.FinalCount==iRep*iObj*10);
+
+ }
+
+
+ public void SetLink(int iRep, int iObj)
+ {
+ DLinkNode[] Mv_DLink;
+
+ Mv_Doub = new DoubLink[iRep];
+ Mv_DLink = new DLinkNode[iRep*10];
+
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Doub[i] = new DoubLink(iObj);
+ Mv_DLink[n_count] = Mv_Doub[i][0];
+ n_count++;
+ }
+
+ }
+
+
+ public void MakeLeak(int iRep)
+ {
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Doub[i] = null;
+ }
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/DoublinkList/dlstack.csproj b/tests/src/GC/Scenarios/DoublinkList/dlstack.csproj
new file mode 100644
index 0000000000..fd11138b0c
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/dlstack.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="DLStack.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="DoubLink.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/DoublinkList/doublinkgen.cs b/tests/src/GC/Scenarios/DoublinkList/doublinkgen.cs
new file mode 100644
index 0000000000..9c5e4b6b04
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/doublinkgen.cs
@@ -0,0 +1,179 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**************************************************************
+/* a basic test case for GC with cyclic Double linked list leaks.
+/* Creat a DoubLink object which is a cyclic Double linked list
+/* object with iObj number node. then deletes its reference when
+/* the next object is created. Do this loop iRep times.
+/**************************************************************/
+
+namespace DoubLink {
+ using System;
+
+ public class DoubLinkGen
+ {
+// disabling unused variable warning
+#pragma warning disable 0414
+ internal DoubLink Mv_Doub;
+#pragma warning restore 0414
+
+ public static int Main(System.String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 100;
+ }
+ break;
+
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 100;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 10;
+ }
+ break;
+
+ default:
+ iRep = 100;
+ iObj = 10;
+ break;
+ }
+
+ DoubLinkGen Mv_Leak = new DoubLinkGen();
+ if(Mv_Leak.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+ SetLink(iRep, iObj);
+ Mv_Doub = null;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ Console.Write(DLinkNode.FinalCount);
+ Console.WriteLine(" DLinkNodes finalized");
+ return (DLinkNode.FinalCount==iRep*iObj);
+
+ }
+
+
+ public void SetLink(int iRep, int iObj)
+ {
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Doub = new DoubLink(iObj);
+ }
+
+ }
+
+ }
+
+ public class DoubLink
+ {
+ internal DLinkNode[] Mv_DLink;
+
+ public DoubLink(int Num)
+ : this(Num, false)
+ {
+ }
+
+ public DoubLink(int Num, bool large)
+ {
+
+ Mv_DLink = new DLinkNode[Num];
+
+ if (Num == 0)
+ {
+ return;
+ }
+
+ if (Num == 1)
+ {
+ // only one element
+ Mv_DLink[0] = new DLinkNode((large ? 250 : 1), Mv_DLink[0], Mv_DLink[0]);
+ return;
+ }
+
+ // first element
+ Mv_DLink[0] = new DLinkNode((large ? 250 : 1), Mv_DLink[Num - 1], Mv_DLink[1]);
+
+ // all elements in between
+ for (int i = 1; i < Num - 1; i++)
+ {
+ Mv_DLink[i] = new DLinkNode((large ? 250 : i + 1), Mv_DLink[i - 1], Mv_DLink[i + 1]);
+ }
+
+ // last element
+ Mv_DLink[Num - 1] = new DLinkNode((large ? 250 : Num), Mv_DLink[Num - 2], Mv_DLink[0]);
+ }
+
+
+ public int NodeNum
+ {
+ get
+ {
+ return Mv_DLink.Length;
+ }
+ }
+
+
+ public DLinkNode this[int index]
+ {
+ get
+ {
+ return Mv_DLink[index];
+ }
+
+ set
+ {
+ Mv_DLink[index] = value;
+ }
+ }
+
+ }
+
+ public class DLinkNode
+ {
+ // disabling unused variable warning
+#pragma warning disable 0414
+ internal DLinkNode Last;
+ internal DLinkNode Next;
+ internal int[] Size;
+#pragma warning restore 0414
+
+ public static int FinalCount = 0;
+
+ public DLinkNode(int SizeNum, DLinkNode LastObject, DLinkNode NextObject)
+ {
+ Last = LastObject;
+ Next = NextObject;
+ Size = new int[SizeNum * 1024];
+ }
+
+ ~DLinkNode()
+ {
+ FinalCount++;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/DoublinkList/doublinkgen.csproj b/tests/src/GC/Scenarios/DoublinkList/doublinkgen.csproj
new file mode 100644
index 0000000000..b0ebf65045
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/doublinkgen.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="doubLinkGen.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/DoublinkList/doublinknoleak.cs b/tests/src/GC/Scenarios/DoublinkList/doublinknoleak.cs
new file mode 100644
index 0000000000..1910b0667f
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/doublinknoleak.cs
@@ -0,0 +1,95 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**************************************************************
+/* this test creates Cyclic double linked list objects in a loop,
+/* before creat a new object, it delete all node references to root
+/* except the first node to make a fake leak for GC.
+/**************************************************************/
+
+namespace DoubLink {
+ using System;
+ using System.Collections.Generic;
+
+ public class DoubLinkNoLeak
+ {
+ internal DoubLink[] Mv_Doub;
+ internal Queue<DLinkNode> Mv_Save = new Queue<DLinkNode>(10);
+
+ public static int Main(System.String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 30;
+ }
+ break;
+
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 30;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 10;
+ }
+ break;
+
+ default:
+ iRep = 30;
+ iObj = 10;
+ break;
+ }
+
+ DoubLinkNoLeak Mv_Leak = new DoubLinkNoLeak();
+ if(Mv_Leak.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+ for(int i=0; i<10; i++)
+ {
+ SetLink(iRep, iObj);
+ }
+
+ Mv_Doub = null;
+ Mv_Save = null;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ Console.WriteLine("{0} DLinkNodes finalized", DLinkNode.FinalCount);
+ return (DLinkNode.FinalCount==iRep*iObj*10);
+
+ }
+
+
+ public void SetLink(int iRep, int iObj)
+ {
+ Mv_Doub = new DoubLink[iRep];
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Doub[i] = new DoubLink(iObj);
+ Mv_Save.Enqueue(Mv_Doub[i][0]);
+ }
+
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/DoublinkList/doublinknoleak.csproj b/tests/src/GC/Scenarios/DoublinkList/doublinknoleak.csproj
new file mode 100644
index 0000000000..574213978f
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/doublinknoleak.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="doubLinkNoLeak.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="DoubLink.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/DoublinkList/doublinknoleak2.cs b/tests/src/GC/Scenarios/DoublinkList/doublinknoleak2.cs
new file mode 100644
index 0000000000..ee41f04b3a
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/doublinknoleak2.cs
@@ -0,0 +1,209 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**************************************************************
+/* a test case based on DoubLinkStay. Instead of delete all of
+/* the reference to a Cyclic Double linked list, it creats one
+/* reference to the first node of the linked list, then delete all old
+/* reference. This test trys to make fake leak for GC.
+/**************************************************************/
+
+namespace DoubLink {
+ using System;
+
+ public class DoubLinkNoLeak2
+ {
+
+ internal DoubLink[] Mv_Doub;
+ internal DLinkNode[] Mv_DLink;
+ internal int n_count = 0;
+
+ public static int Main(System.String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 5;
+ }
+ iObj = 10;
+ break;
+
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 5;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 10;
+ }
+ break;
+
+ default:
+ iRep = 5;
+ iObj = 10;
+ break;
+ }
+
+ DoubLinkNoLeak2 Mv_Leak = new DoubLinkNoLeak2();
+ if(Mv_Leak.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+ Mv_DLink = new DLinkNode[iRep*10];
+
+ for(int i=0; i <10; i++)
+ {
+ SetLink(iRep, iObj);
+ MakeLeak(iRep);
+ }
+
+ Mv_DLink = null;
+ Mv_Doub = null;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ //do a second GC collect since some nodes may have been still alive at the time of first collect
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ int totalNodes = iRep * iObj * 10;
+ Console.Write(DLinkNode.FinalCount);
+ Console.Write(" DLinkNodes finalized out of ");
+ Console.WriteLine(totalNodes);
+
+ return (DLinkNode.FinalCount == totalNodes);
+
+ }
+
+
+ public void SetLink(int iRep, int iObj)
+ {
+ Mv_Doub = new DoubLink[iRep];
+
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Doub[i] = new DoubLink(iObj);
+
+ Mv_DLink[n_count] = Mv_Doub[i][0];
+ n_count++;
+ }
+
+ }
+
+
+ public void MakeLeak(int iRep)
+ {
+
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Doub[i] = null;
+ }
+ }
+
+ }
+
+ public class DoubLink
+ {
+ internal DLinkNode[] Mv_DLink;
+
+ public DoubLink(int Num)
+ : this(Num, false)
+ {
+ }
+
+ public DoubLink(int Num, bool large)
+ {
+
+ Mv_DLink = new DLinkNode[Num];
+
+ if (Num == 0)
+ {
+ return;
+ }
+
+ if (Num == 1)
+ {
+ // only one element
+ Mv_DLink[0] = new DLinkNode((large ? 250 : 1), Mv_DLink[0], Mv_DLink[0]);
+ return;
+ }
+
+ // first element
+ Mv_DLink[0] = new DLinkNode((large ? 250 : 1), Mv_DLink[Num - 1], Mv_DLink[1]);
+
+ // all elements in between
+ for (int i = 1; i < Num - 1; i++)
+ {
+ Mv_DLink[i] = new DLinkNode((large ? 250 : i + 1), Mv_DLink[i - 1], Mv_DLink[i + 1]);
+ }
+
+ // last element
+ Mv_DLink[Num - 1] = new DLinkNode((large ? 250 : Num), Mv_DLink[Num - 2], Mv_DLink[0]);
+ }
+
+
+ public int NodeNum
+ {
+ get
+ {
+ return Mv_DLink.Length;
+ }
+ }
+
+
+ public DLinkNode this[int index]
+ {
+ get
+ {
+ return Mv_DLink[index];
+ }
+
+ set
+ {
+ Mv_DLink[index] = value;
+ }
+ }
+
+ }
+
+ public class DLinkNode
+ {
+ // disabling unused variable warning
+#pragma warning disable 0414
+ internal DLinkNode Last;
+ internal DLinkNode Next;
+ internal int[] Size;
+#pragma warning restore 0414
+
+ public static int FinalCount = 0;
+
+ public DLinkNode(int SizeNum, DLinkNode LastObject, DLinkNode NextObject)
+ {
+ Last = LastObject;
+ Next = NextObject;
+ Size = new int[SizeNum * 1024];
+ }
+
+ ~DLinkNode()
+ {
+ FinalCount++;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/DoublinkList/doublinknoleak2.csproj b/tests/src/GC/Scenarios/DoublinkList/doublinknoleak2.csproj
new file mode 100644
index 0000000000..b387806623
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/doublinknoleak2.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="doubLinkNoLeak2.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/DoublinkList/doublinkstay.cs b/tests/src/GC/Scenarios/DoublinkList/doublinkstay.cs
new file mode 100644
index 0000000000..ab0ea49b40
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/doublinkstay.cs
@@ -0,0 +1,194 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/******************************************************************
+/*Test case for testing GC with cyclic double linked list leaks
+/*In every loop. SetLink() to create a doubLink object array whose size
+/*is iRep, each DoubLink Object is a iObj node cyclic double
+/*linked list. MakeLeak() deletes all the object reference in the array
+/*to make all the cyclic double linked lists become memory leaks.
+/*objects' life time is longer than DoubLinkGen.
+/******************************************************************/
+
+namespace DoubLink {
+ using System;
+
+ public class DoubLinkStay
+ {
+ internal DoubLink[] Mv_Doub;
+
+ public static int Main(System.String [] Args)
+ {
+ int iRep = 100;
+ int iObj = 10;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 100;
+ }
+ break;
+
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 100;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 10;
+ }
+ break;
+
+ default:
+ iRep = 100;
+ iObj = 10;
+ break;
+ }
+
+ DoubLinkStay Mv_Leak = new DoubLinkStay();
+ if(Mv_Leak.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+
+ }
+
+ public bool runTest(int iRep, int iObj)
+ {
+ Mv_Doub = new DoubLink[iRep];
+ for(int i=0; i<20; i++)
+ {
+ SetLink(iRep, iObj);
+ MakeLeak(iRep);
+ }
+
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ Console.Write(DLinkNode.FinalCount);
+ Console.WriteLine(" DLinkNodes finalized");
+ return (DLinkNode.FinalCount==iRep*iObj*20);
+
+ }
+
+ public void SetLink(int iRep, int iObj)
+ {
+
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Doub[i] = new DoubLink(iObj);
+ }
+
+ }
+
+
+ public void MakeLeak(int iRep)
+ {
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Doub[i] = null;
+ }
+ }
+
+ }
+
+ public class DoubLink
+ {
+ internal DLinkNode[] Mv_DLink;
+
+ public DoubLink(int Num)
+ : this(Num, false)
+ {
+ }
+
+ public DoubLink(int Num, bool large)
+ {
+
+ Mv_DLink = new DLinkNode[Num];
+
+ if (Num == 0)
+ {
+ return;
+ }
+
+ if (Num == 1)
+ {
+ // only one element
+ Mv_DLink[0] = new DLinkNode((large ? 250 : 1), Mv_DLink[0], Mv_DLink[0]);
+ return;
+ }
+
+ // first element
+ Mv_DLink[0] = new DLinkNode((large ? 250 : 1), Mv_DLink[Num - 1], Mv_DLink[1]);
+
+ // all elements in between
+ for (int i = 1; i < Num - 1; i++)
+ {
+ Mv_DLink[i] = new DLinkNode((large ? 250 : i + 1), Mv_DLink[i - 1], Mv_DLink[i + 1]);
+ }
+
+ // last element
+ Mv_DLink[Num - 1] = new DLinkNode((large ? 250 : Num), Mv_DLink[Num - 2], Mv_DLink[0]);
+ }
+
+
+ public int NodeNum
+ {
+ get
+ {
+ return Mv_DLink.Length;
+ }
+ }
+
+
+ public DLinkNode this[int index]
+ {
+ get
+ {
+ return Mv_DLink[index];
+ }
+
+ set
+ {
+ Mv_DLink[index] = value;
+ }
+ }
+
+ }
+
+ public class DLinkNode
+ {
+ // disabling unused variable warning
+#pragma warning disable 0414
+ internal DLinkNode Last;
+ internal DLinkNode Next;
+ internal int[] Size;
+#pragma warning restore 0414
+
+ public static int FinalCount = 0;
+
+ public DLinkNode(int SizeNum, DLinkNode LastObject, DLinkNode NextObject)
+ {
+ Last = LastObject;
+ Next = NextObject;
+ Size = new int[SizeNum * 1024];
+ }
+
+ ~DLinkNode()
+ {
+ FinalCount++;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/DoublinkList/doublinkstay.csproj b/tests/src/GC/Scenarios/DoublinkList/doublinkstay.csproj
new file mode 100644
index 0000000000..95c34308a0
--- /dev/null
+++ b/tests/src/GC/Scenarios/DoublinkList/doublinkstay.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="DoubLinkStay.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/DoublinkList/project.json b/tests/src/GC/Scenarios/DoublinkList/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Scenarios/DoublinkList/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Scenarios/Dynamo/app.config b/tests/src/GC/Scenarios/Dynamo/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/Dynamo/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/Dynamo/basenode.cs b/tests/src/GC/Scenarios/Dynamo/basenode.cs
new file mode 100644
index 0000000000..268d63b225
--- /dev/null
+++ b/tests/src/GC/Scenarios/Dynamo/basenode.cs
@@ -0,0 +1,30 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Dynamo {
+ using System;
+
+ public class BaseNode
+ {
+ protected int iValue = 0;
+ protected int iType = 111111;
+ public static Dynamo Cv_Dynamo;
+
+ public int Value {
+ get { return iValue; }
+ set { iValue = value; }
+ }
+
+ public int Type {
+ get { return iType; }
+ }
+
+ ~BaseNode()
+ {
+ if (Cv_Dynamo!=null)
+ Cv_Dynamo.RegisterCleanup( Type, Value );
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/Dynamo/dynamo.cs b/tests/src/GC/Scenarios/Dynamo/dynamo.cs
new file mode 100644
index 0000000000..d4a655980f
--- /dev/null
+++ b/tests/src/GC/Scenarios/Dynamo/dynamo.cs
@@ -0,0 +1,303 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*
+ * Changes:
+ * -removed hardcoded Dyanmo parameters
+ * -allow Dynamo parameters to be passed from command-line
+ * -checks 3 random nodes, as well as first & last nodes
+ * -added ability to pass random seed
+ * -outputs random seed for reproducibility
+ * -fixed crashes, caught exceptions
+ * -improved analysis logic
+ * -converted getters/setters to properties
+ * -removed unused/useless methods
+ * -general code cleanup
+ *
+ * As far as I can tell, this code creates one StaticNode that links to 2 DynamoNodes
+ * which in turn links to an array of RandomNodes for each DynamoNode. It then kills
+ * 5 StaticNodes by setting them to null. It then checks to see if the StaticNodes'
+ * finalizers have been run, thus cleaning up the linked nodes.
+ *
+ * There are quite a few arrays and ints that don't seem to be used for anything,
+ * as labeled below.
+ * Notes:
+ * -passes with complus_gcstress=0,1,2,3,4
+ * -passes with complus_hitminops
+ * -passes in debug
+ */
+
+
+namespace Dynamo {
+ using System;
+ using System.Threading;
+ using System.Diagnostics;
+
+ public class Dynamo
+ {
+ protected StaticNode [] NodeBank;
+ protected int [] LessRandomValues;
+ protected int [] LargeRandomValues;
+ protected int [] DynamoValues = new int[2]; // what is this for?
+ protected int StaticValue; // what is this for?
+
+ protected int [] ChkRandomValues;
+ protected int ChkRandomNum = 0;
+ protected int [] ChkDynamoValues; // what is this for?
+ protected int ChkDynamoNum = 0; // what is this for?
+ protected int ChkStaticValue; // what is this for?
+
+ public static int Main( String [] args)
+ {
+ int seed = (int)DateTime.Now.Ticks;
+ if ( args.Length==3 )
+ {
+ if (!Int32.TryParse(args[2], out seed))
+ {
+ // incorrect value passed to Dynamo
+ Usage();
+ return 1;
+ }
+ }
+ else if ( args.Length!=2 ) {
+ // incorrect number of parameters
+ Usage();
+ return 1;
+ }
+
+ Dynamo Mv_Dynamo;
+ int numElements, numDynamics;
+
+ if (!Int32.TryParse(args[0], out numElements) || !Int32.TryParse(args[1], out numDynamics))
+ {
+ Usage();
+ return 1;
+ }
+
+ try
+ {
+ Mv_Dynamo = new Dynamo( numElements, numDynamics );
+ } catch ( ArgumentException e) {
+ // incorrect value passed to Dynamo
+ Console.WriteLine("Dynamo: " + e.Message);
+ return 1;
+ }
+
+ if ( Mv_Dynamo.RunTest(seed ))
+ return 100; //pass
+
+ return 1; //fail
+ }
+
+
+ // prints usage message to console
+ public static void Usage() {
+ Console.WriteLine("Usage: Dynamo n m [seed]");
+ Console.WriteLine(" where n is the number of elements");
+ Console.WriteLine(" and m is the number of dynamo nodes");
+ Console.WriteLine(" ( m<=n; m,n>10 )");
+ Console.WriteLine(" seed is an optional random seed, by default DateTime.Now.Ticks is used");
+ }
+
+ // begins the test
+ public bool RunTest(int randomSeed )
+ {
+ Console.WriteLine( "Total amount of RandomNode Memory: " );
+ Console.WriteLine( RandomNode.TotalMemory );
+ Console.WriteLine( " " );
+ Console.WriteLine( "Running Finalize Test..." );
+ Console.WriteLine( " ");
+
+ Prep( );
+ bool result = false;
+
+ // kill the first and last nodes
+ if (KillNode(0) && KillNode(NodeBank.Length-1) ) {
+
+ // kill three random nodes
+ result = true;
+ int[] randNums = {0, 0, 0};
+ for (int i=0; i<2; i++) {
+ // choose a random index to kill
+ Random rand = new Random(randomSeed);
+ do {
+ randNums[i] = rand.Next() % NodeBank.Length;
+ // make sure we don't kill a previously killed node!
+ } while ( (randNums[i]==0)
+ || (randNums[i]==NodeBank.Length-1)
+ || (randNums[i]==randNums[(i+1)%3])
+ || (randNums[i]==randNums[(i+2)%3]) );
+
+ if (!KillNode(randNums[i])) {
+ result = false;
+ break;
+ }
+ }
+ }
+
+ Console.WriteLine();
+ if ( result )
+ Console.WriteLine("Test Passed with seed: " + randomSeed);
+ else
+ Console.WriteLine("Test Failed with seed: " + randomSeed);
+
+ return result;
+ }
+
+
+ public void Prep( )
+ {
+ StaticNode.Cv_Dynamo = this; // No worries - static fields are not references - they are roots
+ ChkRandomValues = new int[ NodeBank[0].SmallNode.Length + NodeBank[0].LargeNode.Length ];
+ }
+
+
+ public void AnalyzeNode( int StaticNode )
+ {
+ LessRandomValues = new int[ NodeBank[ StaticNode ].SmallNode.Length];
+ LargeRandomValues = new int [ NodeBank[ StaticNode ].LargeNode.Length ];
+
+ DynamoValues[ 0 ] = NodeBank[ StaticNode ].SmallNode.Value;
+ DynamoValues[ 1 ] = NodeBank[ StaticNode ].LargeNode.Value;
+
+ Debug.Assert(NodeBank[ StaticNode ].SmallNode.Length == NodeBank[ StaticNode ].LargeNode.Length);
+
+ for( int i = 0; i < NodeBank[ StaticNode ].SmallNode.Length; i++ ) {
+ LessRandomValues[ i ] = NodeBank[ StaticNode ].SmallNode[i].Value;
+ LargeRandomValues[ i ] = NodeBank[ StaticNode ].LargeNode[i].Value;
+ }
+
+ StaticValue = NodeBank[ StaticNode ].Value;
+ }
+
+
+ public bool Compare( )
+ {
+ Thread.CurrentThread.Join(10);
+
+ // First check to see if the right number of Random Nodes are destroyed
+ int ChkRan = ( LessRandomValues.Length + LargeRandomValues.Length );
+
+ if( ChkRandomNum != ChkRan)
+ {
+ Console.WriteLine( "The registered number: " + ChkRan );
+ Console.WriteLine( "The analyzed number: " + ChkRandomNum );
+ Console.WriteLine( "The registered number and analyzed number are not equal" );
+ return false;
+ }
+
+ // Note: This does not find a node if it was cleaned up by mistake.
+ for( int i = 0; i < ChkRan; i++ )
+ {
+ int CheckValue = ChkRandomValues[ i ];
+ bool foundLess = false, foundLarge = false;
+
+ foreach (int j in LessRandomValues)
+ {
+ if( CheckValue == j ) {
+ foundLess = true;
+ break;
+ }
+ }
+
+ if ( !foundLess )
+ {
+ foreach (int j in LargeRandomValues)
+ {
+ if( CheckValue == j ) {
+ foundLarge = true;
+ break;
+ }
+ }
+
+ if ( !foundLarge )
+ {
+ Console.WriteLine( "Match not found! Random Node: ");
+ Console.WriteLine( CheckValue );
+ Console.WriteLine(" did not get cleaned up.");
+ return false;
+ }
+
+ }
+
+ }
+
+ return true;
+ }
+
+
+ public void RegisterCleanup( int Type, int Value )
+ {
+ switch( Type )
+ {
+ case 0:
+ // static node
+ ChkStaticValue = Value;
+ break;
+ case 1:
+ // dynamo node
+ ChkDynamoValues[ ChkDynamoNum++ ] = Value;
+ break;
+ case 2:
+ // random node
+ if (ChkRandomNum<ChkRandomValues.Length)
+ ChkRandomValues[ ChkRandomNum++ ] = Value;
+ break;
+ default:
+ Console.WriteLine( "Test error has occured: Unknown Type - {0} given", Type );
+ break;
+ }
+ }
+
+
+ public bool KillNode( int Node)
+ {
+ Console.WriteLine("Deleting Node:");
+ Console.WriteLine( Node );
+
+ AnalyzeNode( Node ); // <- Finalizers not supported
+ NodeBank[ Node ] = null; // <- Finalizers not supported
+
+ GC.Collect(); // Could attempt to cause GC instead of attempting to force it
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ bool Result = Compare( ); // finalizers not supported
+
+ ChkDynamoNum = 0; // finalizers not supported
+ ChkRandomNum = 0; // finalizers not supported
+
+ return Result;
+ }
+
+
+ public Dynamo( int numElements, int numDynamics )
+ {
+
+ Console.WriteLine(" ");
+
+ if ( (numElements < numDynamics ) || (numDynamics<10))
+ throw new ArgumentException();
+ else
+ {
+ ChkDynamoValues = new int[numDynamics];
+ NodeBank = new StaticNode[numDynamics/2];
+ int iDynamic = numElements / numDynamics;
+
+ int Low = 0;
+ int High = iDynamic * 2;
+
+ for( int i = 0; i < NodeBank.Length; i++ )
+ {
+ NodeBank[i] = new StaticNode( Low, High );
+
+ Low = High;
+ High += iDynamic * 2;
+ }
+ }
+
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/Dynamo/dynamo.csproj b/tests/src/GC/Scenarios/Dynamo/dynamo.csproj
new file mode 100644
index 0000000000..c697d81253
--- /dev/null
+++ b/tests/src/GC/Scenarios/Dynamo/dynamo.csproj
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>1000 40 191919</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="Dynamo.cs" />
+ <Compile Include="BaseNode.cs" />
+ <Compile Include="DynamoNode.cs" />
+ <Compile Include="RandomNode.cs" />
+ <Compile Include="StaticNode.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Dynamo/dynamonode.cs b/tests/src/GC/Scenarios/Dynamo/dynamonode.cs
new file mode 100644
index 0000000000..81d4f61588
--- /dev/null
+++ b/tests/src/GC/Scenarios/Dynamo/dynamonode.cs
@@ -0,0 +1,48 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Dynamo {
+ using System;
+
+ public class DynamoNode : BaseNode
+ {
+
+ protected RandomNode [] DynamicArray;
+
+ public DynamoNode( int LowNum, int HighNum, int Value)
+ {
+
+ if (HighNum<LowNum)
+ throw new FormatException("HighNum must be <= LowNum");
+
+ iType = 1;
+ this.Value = Value;
+
+ DynamicArray = new RandomNode[ HighNum - LowNum ];
+
+ for( int iCounter = 0, i = LowNum; i < HighNum; i++, iCounter++)
+ DynamicArray[ iCounter ] = new RandomNode( i * ( HighNum - LowNum ), i );
+
+ }
+
+ public int Length
+ {
+ get { return DynamicArray.Length; }
+ }
+
+ public RandomNode this[int index]
+ {
+ get {
+ try {
+ return DynamicArray[ index ];
+ }
+ catch (IndexOutOfRangeException) {
+ return null;
+ }
+ }
+ }
+
+ }
+}
+
diff --git a/tests/src/GC/Scenarios/Dynamo/randomnode.cs b/tests/src/GC/Scenarios/Dynamo/randomnode.cs
new file mode 100644
index 0000000000..9b42d1fecf
--- /dev/null
+++ b/tests/src/GC/Scenarios/Dynamo/randomnode.cs
@@ -0,0 +1,35 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Dynamo {
+ using System;
+
+ public class RandomNode : BaseNode
+ {
+ public static int TotalMemory = 0;
+
+ protected byte [] SimpleSize;
+ protected int size = 0;
+
+
+ public RandomNode( int Size, int Value )
+ {
+ this.Value = Value;
+ iType = 2;
+
+ if ( Size < 0 )
+ throw new FormatException("Size must >= 0");
+ else if ( Size > 0 ) {
+ SimpleSize = new byte[ Size ];
+ SimpleSize[0] = (byte)255;
+ SimpleSize[Size - 1] = (byte)255;
+
+ TotalMemory+=Size;
+ size = Size;
+ }
+
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/Dynamo/staticnode.cs b/tests/src/GC/Scenarios/Dynamo/staticnode.cs
new file mode 100644
index 0000000000..2daa543234
--- /dev/null
+++ b/tests/src/GC/Scenarios/Dynamo/staticnode.cs
@@ -0,0 +1,41 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Dynamo {
+ using System;
+
+ public class StaticNode : BaseNode
+ {
+ protected static int siValue = 200065;
+
+ protected DynamoNode smallNode;
+ protected DynamoNode largeNode;
+
+ public StaticNode( int LowNum, int HighNum )
+ {
+
+ if (HighNum<LowNum)
+ throw new FormatException("HighNum must be <= LowNum");
+
+ Value = siValue++;
+ iType = 0;
+
+ int Half = (HighNum - LowNum) / 2;
+
+ SmallNode = new DynamoNode( LowNum, (LowNum + Half), (siValue + 100000) );
+ LargeNode = new DynamoNode( ( LowNum + Half ), HighNum, (siValue + 100001) );
+ }
+
+ public DynamoNode SmallNode {
+ get { return smallNode; }
+ set { smallNode = value; }
+ }
+
+ public DynamoNode LargeNode {
+ get { return largeNode; }
+ set { largeNode = value; }
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/FinalNStruct/finalnstruct.cs b/tests/src/GC/Scenarios/FinalNStruct/finalnstruct.cs
new file mode 100644
index 0000000000..dec992656b
--- /dev/null
+++ b/tests/src/GC/Scenarios/FinalNStruct/finalnstruct.cs
@@ -0,0 +1,68 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//***************************************************************************/
+//* Test: FinalNStruct
+//* Coverage: 1. check if GC can collect NStruct memeory (externally_allocated
+//* memory correctly.
+//* 2. If all NStruct's finalize() get called after they lose ref.
+//****************************************************************************/
+
+namespace NStruct {
+ using System;
+
+ internal class FinalNStruct
+ {
+
+ public static STRMAP[] CreateObj(int iObj)
+ {
+
+ STRMAP []strmap = new STRMAP[iObj];
+ for (int i=0; i< iObj; i++ ) //allocate 3100KB
+ {
+ strmap[i] = new STRMAP();
+ }
+ return strmap;
+
+ }
+
+ public static bool RunTest(int iObj,STRMAP []strmap)
+ {
+
+ for( int i=0; i< iObj; i++ )
+ {
+ strmap[i] = null;
+ }
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ return ( FinalizeCount.icFinal == FinalizeCount.icCreat );
+
+ }
+
+ public static int Main(String [] args){
+
+ int iObj = 100;
+ STRMAP []strmaptemp;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ strmaptemp = CreateObj(iObj);
+ if (RunTest(iObj,strmaptemp))
+ {
+ Console.WriteLine( "Created objects number is same with finalized objects." );
+ Console.WriteLine( "Test Passed !" );
+ return 100;
+ }
+
+ Console.WriteLine( "Created objects number is not same with finalized objects (" + FinalizeCount.icFinal + " of " + FinalizeCount.icCreat + ")");
+ Console.WriteLine( "Test failed !" );
+ return 1;
+
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/FinalNStruct/finalnstruct.csproj b/tests/src/GC/Scenarios/FinalNStruct/finalnstruct.csproj
new file mode 100644
index 0000000000..5ea0a227c9
--- /dev/null
+++ b/tests/src/GC/Scenarios/FinalNStruct/finalnstruct.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="FinalNStruct.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="strmap.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/FinalNStruct/nstructresur.cs b/tests/src/GC/Scenarios/FinalNStruct/nstructresur.cs
new file mode 100644
index 0000000000..0de2dbc547
--- /dev/null
+++ b/tests/src/GC/Scenarios/FinalNStruct/nstructresur.cs
@@ -0,0 +1,63 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*****************************************************************************/
+/* Test: NStructResur
+/* Coverage: NStruct objects' finalize can be called and the objects can be
+/* resurrected in finalize correctly. (verify it by accessing the
+/* objects after finalization.
+/******************************************************************************/
+
+namespace NStruct {
+ using System;
+ using System.Collections.Generic;
+
+ internal class NStructResur
+ {
+ internal static List<STRMAP> alstrmap;
+
+ public static void CreateObj(int iObj)
+ {
+ alstrmap = new List<STRMAP>();
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ for( int i=0; i< iObj; i++ ) //allocat 3100KB
+ {
+ alstrmap.Add(new STRMAP() );
+ }
+
+ alstrmap = new List<STRMAP>();
+
+ }
+
+ public static bool RunTest()
+ {
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ for(int i=0; i<alstrmap.Count; i++)
+ {
+ alstrmap[i].AccessElement();
+ }
+
+ Console.WriteLine("Created object: {0}, Finalized objects: {1}", FinalizeCount.icCreat, FinalizeCount.icFinal);
+ return ( FinalizeCount.icFinal == FinalizeCount.icCreat );
+ }
+
+ public static int Main(String [] args)
+ {
+ CreateObj(100);
+ if (RunTest())
+ {
+ Console.WriteLine( "Test Passed" );
+ return 100;
+ }
+ Console.WriteLine( "Test failed" );
+ return 1;
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/FinalNStruct/nstructresur.csproj b/tests/src/GC/Scenarios/FinalNStruct/nstructresur.csproj
new file mode 100644
index 0000000000..74479be37d
--- /dev/null
+++ b/tests/src/GC/Scenarios/FinalNStruct/nstructresur.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="NStructResur.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="strmap.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/FinalNStruct/nstructtun.cs b/tests/src/GC/Scenarios/FinalNStruct/nstructtun.cs
new file mode 100644
index 0000000000..2523fcc1d1
--- /dev/null
+++ b/tests/src/GC/Scenarios/FinalNStruct/nstructtun.cs
@@ -0,0 +1,74 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace NStruct {
+ using System;
+
+ internal class NStructTun
+ {
+
+ public class CreateObj
+ {
+// disabling unused variable warning
+#pragma warning disable 0414
+ private STRMAP Strmap;
+#pragma warning restore 0414
+ public CreateObj(int Rep)
+ {
+ for( int i=0; i< Rep; i++ )
+ {
+ Strmap = new STRMAP();
+ }
+ }
+
+ public bool RunTest()
+ {
+ Strmap=null;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ Console.Out.WriteLine(FinalizeCount.icCreat + " NStruct Objects were deleted and "+ FinalizeCount.icFinal +" finalized.");
+
+ return (FinalizeCount.icCreat == FinalizeCount.icFinal );
+ }
+
+ }
+
+ public static int Main(String [] Args)
+ {
+ int iRep = 0;
+
+ Console.Out.WriteLine("Test should return with ExitCode 100 ...");
+
+ if( Args.Length == 1)
+ {
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep =10000;
+ }
+ }
+ else
+ {
+ iRep =10000;
+ }
+ Console.Out.WriteLine("iRep = "+iRep );
+
+ CreateObj temp = new CreateObj(iRep);
+
+ if(temp.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+
+ }
+ }
+
+
+}
diff --git a/tests/src/GC/Scenarios/FinalNStruct/nstructtun.csproj b/tests/src/GC/Scenarios/FinalNStruct/nstructtun.csproj
new file mode 100644
index 0000000000..b272f18ca7
--- /dev/null
+++ b/tests/src/GC/Scenarios/FinalNStruct/nstructtun.csproj
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="NStructTun.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="strmap.csproj" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/FinalNStruct/project.json b/tests/src/GC/Scenarios/FinalNStruct/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Scenarios/FinalNStruct/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Scenarios/FinalNStruct/strmap.csproj b/tests/src/GC/Scenarios/FinalNStruct/strmap.csproj
index cd37dceef8..9bf6bdf298 100644
--- a/tests/src/GC/Scenarios/FinalNStruct/strmap.csproj
+++ b/tests/src/GC/Scenarios/FinalNStruct/strmap.csproj
@@ -32,8 +32,12 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
</ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
diff --git a/tests/src/GC/Scenarios/FinalizeTimeout/FinalizeTimeout.csproj b/tests/src/GC/Scenarios/FinalizeTimeout/FinalizeTimeout.csproj
index e7ef60d2a6..5fa8b555ac 100644
--- a/tests/src/GC/Scenarios/FinalizeTimeout/FinalizeTimeout.csproj
+++ b/tests/src/GC/Scenarios/FinalizeTimeout/FinalizeTimeout.csproj
@@ -18,7 +18,11 @@
<Compile Include="FinalizeTimeout.cs" />
</ItemGroup>
<ItemGroup>
- <None Include="project.json" />
+ <None Include="$(GCPackagesConfigFileDirectory)minimal\project.json" />
</ItemGroup>
- <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project>
diff --git a/tests/src/GC/Scenarios/FinalizeTimeout/project.json b/tests/src/GC/Scenarios/FinalizeTimeout/project.json
deleted file mode 100644
index 14c11d232b..0000000000
--- a/tests/src/GC/Scenarios/FinalizeTimeout/project.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1-rc2-23816",
- "System.Collections": "4.0.10",
- "System.Collections.NonGeneric": "4.0.1-beta-23302",
- "System.Collections.Specialized": "4.0.1-beta-23302",
- "System.ComponentModel": "4.0.1-beta-23302",
- "System.Console": "4.0.0-beta-23302",
- "System.Diagnostics.Process": "4.0.0-beta-23302",
- "System.Globalization": "4.0.10",
- "System.Globalization.Calendars": "4.0.0",
- "System.IO": "4.0.10",
- "System.IO.FileSystem": "4.0.0",
- "System.IO.FileSystem.Primitives": "4.0.0",
- "System.Linq": "4.0.1-beta-23302",
- "System.Linq.Queryable": "4.0.1-beta-23302",
- "System.Reflection": "4.0.10",
- "System.Reflection.Primitives": "4.0.0",
- "System.Runtime": "4.0.20",
- "System.Runtime.Extensions": "4.0.10",
- "System.Runtime.Handles": "4.0.0",
- "System.Runtime.InteropServices": "4.0.20",
- "System.Runtime.Loader": "4.0.0-beta-23302",
- "System.Text.Encoding": "4.0.10",
- "System.Threading": "4.0.10",
- "System.Xml.ReaderWriter": "4.0.11-beta-23302",
- "System.Xml.XDocument": "4.0.11-beta-23302",
- "System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
- },
- "frameworks": {
- "dnxcore50": {}
- }
-}
diff --git a/tests/src/GC/Scenarios/FragMan/app.config b/tests/src/GC/Scenarios/FragMan/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/FragMan/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/FragMan/fragman.cs b/tests/src/GC/Scenarios/FragMan/fragman.cs
new file mode 100644
index 0000000000..dcd330cb2d
--- /dev/null
+++ b/tests/src/GC/Scenarios/FragMan/fragman.cs
@@ -0,0 +1,311 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/* FragMan
+ *
+ * This test creates an array of FragNodes, then reorganizes them into a tree.
+ * Then it removes the references from the array, and verifies the tree keeps
+ * all the elements alive (verified by checking the Finalized count against 0).
+*/
+
+namespace DefaultNamespace {
+ using System;
+
+ public class FragMan
+ {
+
+ internal int nodeCount = 0;
+ internal FragNode fnM = null;
+ internal FragNode [] CvA_FNodes;
+
+ public static int Main ( String [] Args)
+ {
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ FragMan test = new FragMan( );
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ if (FragNode.Finalized == 0)
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.Write(FragNode.Finalized);
+ Console.WriteLine(" FragNodes were prematurely finalized");
+ Console.WriteLine("Test Failed");
+
+ GC.KeepAlive(test);
+ return 1;
+
+ }
+
+
+ public FragMan( )
+ {
+ buildTree( );
+ fnM = CvA_FNodes[12];
+ CvA_FNodes = null;
+ enumNode( fnM );
+ }
+
+
+ public void enumNode( FragNode Node )
+ {
+
+ nodeCount++;
+
+ Console.WriteLine(Node.Name);
+ if ( Node.Lesser != null )
+ {
+ Console.Write("Lesser is:");
+ Console.WriteLine(Node.Lesser.Name);
+ }
+ if ( Node.Larger != null )
+ {
+ Console.Write("Larger is:");
+ Console.WriteLine(Node.Larger.Name);
+ }
+
+ Console.WriteLine();
+
+ if ( Node.Lesser != null )
+ {
+ enumNode( Node.Lesser );
+ }
+ if ( Node.Larger != null )
+ {
+ enumNode( Node.Larger );
+ }
+
+ }
+
+
+ public void buildTree( )
+ {
+ CvA_FNodes = new FragNode[26];
+ for (int i=0; i<CvA_FNodes.Length; i++)
+ {
+ CvA_FNodes[i] = new FragNode((char)((int)'A'+i));
+
+ }
+
+ // 0
+ CvA_FNodes[ 0 ].Parent =( CvA_FNodes[ 1 ] ); // B
+
+ // 1
+ CvA_FNodes[ 1 ].Parent =( CvA_FNodes[ 3 ] ); // D
+ CvA_FNodes[ 1 ].Lesser =( CvA_FNodes[ 0 ] ); // A
+ CvA_FNodes[ 1 ].Larger =( CvA_FNodes[ 2 ] ); // C
+
+
+ // 2
+ CvA_FNodes[ 2 ].Parent =( CvA_FNodes[ 1 ] ); // B
+
+
+ // 3
+ CvA_FNodes[ 3 ].Parent =( CvA_FNodes[ 6 ] ); // G
+ CvA_FNodes[ 3 ].Lesser =( CvA_FNodes[ 1 ] ); // B
+ CvA_FNodes[ 3 ].Larger =( CvA_FNodes[ 5 ] ); // F
+
+
+ // 4
+ CvA_FNodes[ 4 ].Parent =( CvA_FNodes[ 5 ] ); // F
+
+
+ // 5
+ CvA_FNodes[ 5 ].Parent =( CvA_FNodes[ 3 ] ); // D
+ CvA_FNodes[ 5 ].Lesser =( CvA_FNodes[ 4 ] ); // E
+
+
+ // 6
+ CvA_FNodes[ 6 ].Parent =( CvA_FNodes[ 12 ] ); // M
+ CvA_FNodes[ 6 ].Lesser =( CvA_FNodes[ 3 ] ); // D
+ CvA_FNodes[ 6 ].Larger =( CvA_FNodes[ 9 ] ); // J
+
+
+ // 7
+ CvA_FNodes[ 7 ].Parent =( CvA_FNodes[ 9 ] ); // J
+ CvA_FNodes[ 7 ].Larger =( CvA_FNodes[ 8 ] ); // I
+
+
+ // 8
+ CvA_FNodes[ 8 ].Parent =( CvA_FNodes[ 7 ] ); // H
+
+
+ // 9
+ CvA_FNodes[ 9 ].Parent =( CvA_FNodes[ 6 ] ); // G
+ CvA_FNodes[ 9 ].Lesser =( CvA_FNodes[ 7 ] ); // H
+ CvA_FNodes[ 9 ].Larger =( CvA_FNodes[ 11 ] ); // L
+
+
+ // 10
+ CvA_FNodes[ 10 ].Parent =( CvA_FNodes[ 11 ] ); // L
+
+
+ // 11
+ CvA_FNodes[ 11 ].Parent =( CvA_FNodes[ 9 ] ); // J
+ CvA_FNodes[ 11 ].Lesser =( CvA_FNodes[ 10 ] ); // K
+
+
+ // 12
+ CvA_FNodes[ 12 ].Root= true;
+ CvA_FNodes[ 12 ].Lesser =( CvA_FNodes[ 6 ] ); // G
+ CvA_FNodes[ 12 ].Larger =( CvA_FNodes[ 19 ] ); // T
+
+
+ // 13
+ CvA_FNodes[ 13 ].Parent =( CvA_FNodes[ 14 ] ); // O
+
+
+ // 14
+ CvA_FNodes[ 14 ].Parent =( CvA_FNodes[ 16 ] ); // Q
+ CvA_FNodes[ 14 ].Lesser =( CvA_FNodes[ 13 ] ); // N
+ CvA_FNodes[ 14 ].Larger =( CvA_FNodes[ 15 ] ); // P
+
+
+ // 15
+ CvA_FNodes[ 15 ].Parent =( CvA_FNodes[ 14 ] ); // O
+
+
+ // 16
+ CvA_FNodes[ 16 ].Parent =( CvA_FNodes[ 19 ] ); // T
+ CvA_FNodes[ 16 ].Lesser =( CvA_FNodes[ 14 ] ); // O
+ CvA_FNodes[ 16 ].Larger =( CvA_FNodes[ 18 ] ); // S
+
+
+ // 17
+ CvA_FNodes[ 17 ].Parent =( CvA_FNodes[ 18 ] ); // S
+
+
+ // 18
+ CvA_FNodes[ 18 ].Parent =( CvA_FNodes[ 16 ] ); // Q
+ CvA_FNodes[ 18 ].Lesser =( CvA_FNodes[ 17 ] ); // R
+
+
+ // 19
+ CvA_FNodes[ 19 ].Parent =( CvA_FNodes[ 12 ] ); // M
+ CvA_FNodes[ 19 ].Lesser =( CvA_FNodes[ 16 ] ); // Q
+ CvA_FNodes[ 19 ].Larger =( CvA_FNodes[ 22 ] ); // W
+
+
+ // 20
+ CvA_FNodes[ 20 ].Parent =( CvA_FNodes[ 22 ] ); // W
+ CvA_FNodes[ 20 ].Larger =( CvA_FNodes[ 21 ] ); // V
+
+
+ // 21
+ CvA_FNodes[ 21 ].Parent =( CvA_FNodes[ 20 ] ); // U
+
+
+ // 22
+ CvA_FNodes[ 22 ].Parent =( CvA_FNodes[ 19 ] ); // T
+ CvA_FNodes[ 22 ].Lesser =( CvA_FNodes[ 20 ] ); // U
+ CvA_FNodes[ 22 ].Larger =( CvA_FNodes[ 24 ] ); // Y
+
+
+ // 23
+ CvA_FNodes[ 23 ].Parent =( CvA_FNodes[ 24 ] ); // Y
+
+
+ // 24
+ CvA_FNodes[ 24 ].Parent =( CvA_FNodes[ 22 ] ); // W
+ CvA_FNodes[ 24 ].Lesser =( CvA_FNodes[ 23 ] ); // X
+ CvA_FNodes[ 24 ].Larger =( CvA_FNodes[ 25 ] ); // Z
+
+
+ // 25
+ CvA_FNodes[ 25 ].Parent =( CvA_FNodes[ 24 ] ); // Y
+
+ }
+
+ }
+
+ public class FragNode
+ {
+ internal bool Cv_bRoot = false;
+ internal FragNode Cv_FNodeUpper = null, Cv_FNodeLess = null, Cv_FNodeGreat = null;
+ internal char Cv_SName;
+ public static int Finalized = 0;
+
+ public FragNode(char name)
+ {
+ Cv_SName = name;
+ }
+
+ ~FragNode()
+ {
+ Console.WriteLine("{0} finalized!", Cv_SName);
+ Finalized++;
+ }
+
+ public bool Root
+ {
+ get
+ {
+ return Cv_bRoot;
+ }
+
+ set
+ {
+ Cv_bRoot = value;
+ }
+ }
+
+ public char Name
+ {
+ get
+ {
+ return Cv_SName;
+ }
+
+ }
+
+
+ public FragNode Parent
+ {
+ get
+ {
+ return Cv_FNodeUpper;
+ }
+
+ set
+ {
+ Cv_FNodeUpper = value;
+ }
+ }
+
+
+ public FragNode Lesser
+ {
+ get
+ {
+ return Cv_FNodeLess;
+ }
+
+ set
+ {
+ Cv_FNodeLess = value;
+ }
+ }
+
+
+
+ public FragNode Larger
+ {
+ get
+ {
+ return Cv_FNodeGreat;
+ }
+
+ set
+ {
+ Cv_FNodeGreat = value;
+ }
+ }
+
+ }
+
+}
diff --git a/tests/src/GC/Scenarios/FragMan/fragman.csproj b/tests/src/GC/Scenarios/FragMan/fragman.csproj
new file mode 100644
index 0000000000..6ecec0fdbb
--- /dev/null
+++ b/tests/src/GC/Scenarios/FragMan/fragman.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="FragMan.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/GCBase1/app.config b/tests/src/GC/Scenarios/GCBase1/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/GCBase1/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/GCBase1/gc_base1.cs b/tests/src/GC/Scenarios/GCBase1/gc_base1.cs
new file mode 100644
index 0000000000..733081f4e2
--- /dev/null
+++ b/tests/src/GC/Scenarios/GCBase1/gc_base1.cs
@@ -0,0 +1,171 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System;
+
+ public class GC_Base1
+ {
+ internal RandomNode[] CvA_RandomNode;
+
+ public static int Main( System.String [] Args )
+ {
+
+ int iRep = 0;
+ int iObj = 0;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 15;
+ }
+ break;
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 15;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 1000;
+ }
+ break;
+ default:
+ iRep = 15;
+ iObj = 1000;
+ break;
+ }
+
+ GC_Base1 Mv_Base = new GC_Base1();
+
+ if(Mv_Base.runTest(iRep, iObj ))
+ {
+ Console.WriteLine( "Test Passed" );
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine( "Test Failed" );
+ return 1;
+ }
+ }
+
+
+ public bool runTest( int Rep, int Obj )
+ {
+
+ for( int i = 0; i < Rep; i++ )
+ {
+ CvA_RandomNode = new RandomNode[ Obj ];
+
+ for( int j = 0; j < Obj; j++ )
+ {
+ CvA_RandomNode[ j ] = new RandomNode( j, j );
+ if( j == 0 )
+ {
+ CvA_RandomNode[ j ].setBigSize( 0 );
+ }
+ }
+
+ CvA_RandomNode = null;
+
+ GC.Collect();
+ }
+
+ return true;
+
+ }
+
+ }
+
+ public class BaseNode
+ {
+ internal int iValue = 0;
+ internal int iType = 111111;
+
+ internal static bool UseFinals = true;
+
+ public static bool getUseFinal()
+ {
+ return UseFinals;
+ }
+
+ public static void setUseFinal(bool Final)
+ {
+ UseFinals = Final;
+ }
+
+ public virtual void setValue(int Value)
+ {
+ iValue = Value;
+ }
+
+ public virtual int getValue()
+ {
+ return iValue;
+ }
+
+ public virtual void setType(int Type)
+ {
+ iType = Type;
+ }
+
+ public virtual int getType()
+ {
+ return iType;
+ }
+
+ }
+
+ public class RandomNode : BaseNode
+ {
+ internal byte[] SimpleSize;
+ internal static int iSize = 0;
+ internal int iiSize = 0;
+
+ public RandomNode(int Size, int value)
+ {
+ setValue(value);
+ setType(2);
+ SimpleSize = new byte[Size];
+
+ if (Size != 0)
+ {
+ SimpleSize[0] = (byte)255;
+ SimpleSize[Size - 1] = (byte)255;
+ }
+
+ setSize(Size);
+
+ }
+
+ public virtual void setSize(int Size)
+ {
+ iiSize = Size;
+ iSize += Size;
+ }
+
+ public virtual int getSize()
+ {
+ return iiSize;
+ }
+
+ public virtual int getBigSize()
+ {
+ return iSize;
+ }
+
+ public virtual void setBigSize(int Size)
+ {
+ iSize = Size;
+ }
+
+
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/GCBase1/gc_base1.csproj b/tests/src/GC/Scenarios/GCBase1/gc_base1.csproj
new file mode 100644
index 0000000000..f1220605d9
--- /dev/null
+++ b/tests/src/GC/Scenarios/GCBase1/gc_base1.csproj
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>3 100</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="GC_Base1.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/GCBase1/gc_base1_1.csproj b/tests/src/GC/Scenarios/GCBase1/gc_base1_1.csproj
new file mode 100644
index 0000000000..4d8f3bcb8e
--- /dev/null
+++ b/tests/src/GC/Scenarios/GCBase1/gc_base1_1.csproj
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>8 100</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="GC_Base1.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/GCBench/app.config b/tests/src/GC/Scenarios/GCBench/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/GCBench/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/GCBench/gcbench.cs b/tests/src/GC/Scenarios/GCBench/gcbench.cs
new file mode 100644
index 0000000000..11ffcb4b6f
--- /dev/null
+++ b/tests/src/GC/Scenarios/GCBench/gcbench.cs
@@ -0,0 +1,171 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// This is adapted from a benchmark written by John Ellis and Pete Kovac
+// of Post Communications.
+// It was modified by Hans Boehm of Silicon Graphics.
+//
+// This is no substitute for real applications. No actual application
+// is likely to behave in exactly this way. However, this benchmark was
+// designed to be more representative of real applications than other
+// GC benchmarks of which we are aware.
+// It attempts to model those properties of allocation requests that
+// are important to current GC techniques.
+// It is designed to be used either to obtain a single overall performance
+// number, or to give a more detailed estimate of how collector
+// performance varies with object lifetimes. It prints the time
+// required to allocate and collect balanced binary trees of various
+// sizes. Smaller trees result in shorter object lifetimes. Each cycle
+// allocates roughly the same amount of memory.
+// Two data structures are kept around during the entire process, so
+// that the measured performance is representative of applications
+// that maintain some live in-memory data. One of these is a tree
+// containing many pointers. The other is a large array containing
+// double precision floating point numbers. Both should be of comparable
+// size.
+//
+// The results are only really meaningful together with a specification
+// of how much memory was used. It is possible to trade memory for
+// better time performance. This benchmark should be run in a 32 MB
+// heap, though we don't currently know how to enforce that uniformly.
+//
+// Unlike the original Ellis and Kovac benchmark, we do not attempt
+// measure pause times. This facility should eventually be added back
+// in. There are several reasons for omitting it for now. The original
+// implementation depended on assumptions about the thread scheduler
+// that don't hold uniformly. The results really measure both the
+// scheduler and GC. Pause time measurements tend to not fit well with
+// current benchmark suites. As far as we know, none of the current
+// commercial implementations seriously attempt to minimize GC pause
+// times.
+
+namespace DefaultNamespace {
+ using System;
+
+ internal class Node
+ {
+ internal Node left;
+ internal Node right;
+
+ internal Node(Node l, Node r)
+ {
+ left = l;
+ right = r;
+ }
+
+ internal Node()
+ {
+ }
+ }
+
+ public class GCBench
+ {
+
+ public const int kStretchTreeDepth = 18; // about 16Mb
+ public const int kLongLivedTreeDepth = 16; // about 4Mb
+ public const int kArraySize = 50; // about 4Mb
+ public const int kMinTreeDepth = 4;
+ public const int kMaxTreeDepth = 16;
+
+ // Nodes used by a tree of a given size
+ internal static int TreeSize(int i)
+ {
+ return ((1 << (i + 1)) - 1);
+ }
+
+ // Number of iterations to use for a given tree depth
+ internal static int NumIters(int i)
+ {
+ return 2 * TreeSize(kStretchTreeDepth) / TreeSize(i);
+ }
+
+ // Build tree top down, assigning to older objects.
+ internal static void Populate(int iDepth, Node thisNode)
+ {
+ if (iDepth<=0)
+ {
+ return;
+ }
+ else
+ {
+ iDepth--;
+ thisNode.left = new Node();
+ thisNode.right = new Node();
+ Populate (iDepth, thisNode.left);
+ Populate (iDepth, thisNode.right);
+ }
+ }
+
+ // Build tree bottom-up
+ internal static Node MakeTree(int iDepth)
+ {
+ if (iDepth<=0)
+ {
+ return new Node();
+ }
+ else
+ {
+ return new Node(MakeTree(iDepth-1), MakeTree(iDepth-1));
+ }
+ }
+
+ internal void TimeConstruction(int depth)
+ {
+
+ int iNumIters = NumIters(depth);
+ Node tempTree;
+
+ for (int i = 0; i < iNumIters; ++i)
+ {
+ tempTree = new Node();
+ Populate(depth, tempTree);
+ tempTree = null;
+ }
+
+
+ for (int i = 0; i < iNumIters; ++i)
+ {
+ tempTree = MakeTree(depth);
+ tempTree = null;
+ }
+
+ }
+
+ public static int Main(String [] args)
+ {
+ Node longLivedTree;
+ Node tempTree;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ GCBench Mv_Obj = new GCBench();
+
+ // Stretch the memory space quickly
+ tempTree = MakeTree(kStretchTreeDepth);
+ tempTree = null;
+
+ // Create a long lived object
+ longLivedTree = new Node();
+ Populate(kLongLivedTreeDepth, longLivedTree);
+
+ // Create long-lived array, filling half of it
+ double []array = new double[kArraySize];
+ for (int i = 0; i < kArraySize/2; ++i)
+ {
+ array[i] = 1.0/i;
+ }
+
+ GC.Collect();
+
+ for (int d = kMinTreeDepth; d <= kMaxTreeDepth; d += 2)
+ {
+ Mv_Obj.TimeConstruction(d);
+ }
+
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ }
+
+}
diff --git a/tests/src/GC/Scenarios/GCBench/gcbench.csproj b/tests/src/GC/Scenarios/GCBench/gcbench.csproj
new file mode 100644
index 0000000000..4644445bc8
--- /dev/null
+++ b/tests/src/GC/Scenarios/GCBench/gcbench.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="GCBench.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/GCStress/app.config b/tests/src/GC/Scenarios/GCStress/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/GCStress/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/GCStress/gcstress.cs b/tests/src/GC/Scenarios/GCStress/gcstress.cs
new file mode 100644
index 0000000000..4862d1b5ca
--- /dev/null
+++ b/tests/src/GC/Scenarios/GCStress/gcstress.cs
@@ -0,0 +1,75 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System;
+
+ internal class GCStress
+ {
+ internal GCStress next;
+ internal byte[] data;
+
+ public static int Main(String [] args)
+ {
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ GCStress obj= new GCStress();
+ if (obj.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+
+ public bool RunTest()
+ {
+ GCStress garbage;
+ GCStress head = null;
+ GCStress tail = null;
+ GCStress walker;
+ int stressCount = 0;
+ int stressCount2 = 0;
+
+ for (int i=0; i<1500000; i++)
+ {
+ byte[] x = new byte [(i %1111)];
+
+ if ((i%100) == 0)
+ {
+ garbage = new GCStress();
+ garbage.data = x;
+ stressCount += x.Length;
+ if (head == null)
+ {
+ head = garbage;
+ }
+ else
+ {
+ tail.next = garbage;
+ }
+
+ tail = garbage;
+ }
+ }
+
+
+ walker = head;
+ while (walker != null)
+ {
+ if (walker.data != null)
+ {
+ stressCount2 += walker.data.Length;
+ }
+ walker = walker.next;
+ }
+
+ Console.WriteLine ("Stress count: {0} {1}", stressCount, stressCount2);
+ return (stressCount == stressCount2);
+ }
+ }
+
+}
diff --git a/tests/src/GC/Scenarios/GCStress/gcstress.csproj b/tests/src/GC/Scenarios/GCStress/gcstress.csproj
new file mode 100644
index 0000000000..6c9caa3b6e
--- /dev/null
+++ b/tests/src/GC/Scenarios/GCStress/gcstress.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="gcstress.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/LeakGen/app.config b/tests/src/GC/Scenarios/LeakGen/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/LeakGen/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/LeakGen/leakgen.cs b/tests/src/GC/Scenarios/LeakGen/leakgen.cs
new file mode 100644
index 0000000000..9235256f81
--- /dev/null
+++ b/tests/src/GC/Scenarios/LeakGen/leakgen.cs
@@ -0,0 +1,110 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+
+namespace LGen {
+ using System;
+
+ public class LeakGen
+ {
+ public static int Main(System.String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0; //the number of Mb will be allocated in MakeLeak();
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 2;
+ }
+ break;
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 2;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 10;
+ }
+ break;
+ default:
+ iRep = 2;
+ iObj = 10;
+ break;
+ }
+
+ LeakGen Mv_Leak = new LeakGen();
+ if(Mv_Leak.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+
+ for(int i = 0; i<iRep; i++)
+ {
+ /*allocate about 10MB memory include MakeLeak() */
+ MakeLeak(iObj);
+ }
+
+ Console.WriteLine("~LeakObject() was called {0} times.", LeakObject.icFinal);
+ return (LeakObject.icFinal == iObj*iRep);
+ }
+
+
+ public void MakeLeak(int iObj)
+ {
+ int [] mem;
+
+ LeakObject []Mv_Obj = new LeakObject[iObj];
+ for(int i=0; i<iObj; i++)
+ {
+ Mv_Obj[i] = new LeakObject(i);
+ mem = new int[1024*250]; //nearly 1MB memory, larger than this will get assert failure .
+ mem[0] = 1;
+ mem[mem.Length-1] = 1;
+ }
+
+ Mv_Obj = null;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ }
+
+
+ }
+
+ public class LeakObject
+ {
+ internal int[] mem;
+ public static int icFinal = 0;
+ public LeakObject(int num)
+ {
+ mem = new int[1024 * 250]; //nearly 1MB memory, larger than this will get assert failure.
+ mem[0] = num;
+ mem[mem.Length - 1] = num;
+ }
+
+ ~LeakObject()
+ {
+ LeakObject.icFinal++;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/LeakGen/leakgen.csproj b/tests/src/GC/Scenarios/LeakGen/leakgen.csproj
new file mode 100644
index 0000000000..b7c433afab
--- /dev/null
+++ b/tests/src/GC/Scenarios/LeakGen/leakgen.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LeakGen.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/LeakGen/leakgenthrd.cs b/tests/src/GC/Scenarios/LeakGen/leakgenthrd.cs
new file mode 100644
index 0000000000..96704f6485
--- /dev/null
+++ b/tests/src/GC/Scenarios/LeakGen/leakgenthrd.cs
@@ -0,0 +1,131 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+
+namespace LGen {
+ using System.Threading;
+ using System;
+ using System.IO;
+
+ public class LeakGenThrd
+ {
+ internal int myObj;
+ internal int Cv_iCounter = 0;
+ internal int Cv_iRep;
+
+ public static int Main(System.String [] Args)
+ {
+ int iRep = 2;
+ int iObj = 15; //the number of MB memory will be allocted in MakeLeak()
+
+ // synchronized console output Console.SetOut(TextWriter.Synchronized(Console.Out));
+ Console.Out.WriteLine("Test should return with ExitCode 100 ...");
+
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 2;
+ }
+ break;
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 2;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 15;
+ }
+ break;
+ default:
+ iRep = 2;
+ iObj = 15;
+ break;
+ }
+
+ LeakGenThrd Mv_Leak = new LeakGenThrd();
+ if(Mv_Leak.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+ Cv_iRep = iRep;
+ myObj = iObj;
+
+ Thread Mv_Thread = new Thread(new ThreadStart(this.ThreadStart));
+ Mv_Thread.Start( );
+
+ for(int i = 0; i<iRep; i++)
+ {
+ MakeLeak(iObj);
+ }
+
+ return true;
+ }
+
+
+
+ public void ThreadStart( )
+ {
+
+ if( Cv_iCounter < Cv_iRep )
+ {
+ LeakObject []Mv_Obj = new LeakObject[myObj];
+ for(int i=0; i<myObj; i++)
+ {
+ Mv_Obj[i] = new LeakObject(i);
+ }
+
+ Cv_iCounter += 1;
+
+ Thread Mv_Thread = new Thread( new ThreadStart(this.ThreadStart) );
+ Mv_Thread.Start( );
+
+ }
+
+ }
+
+ public void MakeLeak(int iObj)
+ {
+
+ LeakObject []Mv_Obj = new LeakObject[iObj];
+ for(int i=0; i<iObj; i++)
+ {
+ Mv_Obj[i] = new LeakObject(i);
+ }
+
+ }
+
+ }
+
+ public class LeakObject
+ {
+ internal int[] mem;
+ public static int icFinal = 0;
+ public LeakObject(int num)
+ {
+ mem = new int[1024 * 250]; //nearly 1MB memory, larger than this will get assert failure.
+ mem[0] = num;
+ mem[mem.Length - 1] = num;
+ }
+
+ ~LeakObject()
+ {
+ LeakObject.icFinal++;
+ }
+ }
+
+}
diff --git a/tests/src/GC/Scenarios/LeakGen/leakgenthrd.csproj b/tests/src/GC/Scenarios/LeakGen/leakgenthrd.csproj
new file mode 100644
index 0000000000..642a69654d
--- /dev/null
+++ b/tests/src/GC/Scenarios/LeakGen/leakgenthrd.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LeakGenThrd.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/LeakWheel/app.config b/tests/src/GC/Scenarios/LeakWheel/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/LeakWheel/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/LeakWheel/leakwheel.cs b/tests/src/GC/Scenarios/LeakWheel/leakwheel.cs
new file mode 100644
index 0000000000..f67c26006b
--- /dev/null
+++ b/tests/src/GC/Scenarios/LeakWheel/leakwheel.cs
@@ -0,0 +1,542 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//************************************************************************/
+//*Test: LeakWheel
+//*Purpose: simulate real world objects allocating and deleting condation.
+//*Description: It create an object table with "iTable" items. Random number
+//* generator will generate number between 0 to iTable, that is ID in the
+//* Table. object will be added or deleted from that table item.
+//* Oject may be varied size, may create a new thread doing the same thing
+//* like main thread. may be a link list. Delete Object may delete single
+//* object, delete a list of object or delete all objects. While create
+//* object, if the table item has had one object, put this object as it's
+//* child object to make a link list. This tests covered link list, Variant
+//* array, Binary tree, finalize, multi_thread, collections, WeakReference.
+//*Arguments: Arg1:iMem(MB), Arg2: iIter(Number of iterations), Arg3:iTable, Arg4: iSeed
+//************************************************************************/
+namespace DefaultNamespace {
+ using System.Threading;
+ using System;
+ using System.IO;
+ using System.Collections;
+ using System.Collections.Generic;
+
+ internal class LeakWheel
+ {
+ internal static int iSeed;
+ internal static int iIter;
+ internal static int iTable;
+ internal static int iMem;
+ internal Node LstNode;
+
+ public static int Main( String [] Args)
+ {
+ // console synchronization Console.SetOut(TextWriter.Synchronized(Console.Out));
+
+ /*max memory will be used. If heap size is bigger than this, */
+
+ // delete all the objects. Default 10MB
+ iMem = 10;
+
+ //How many iterations
+ iIter = 1500000;
+
+ //Max items number in the object table
+ iTable = 500;
+
+ //Seed for generate random iKey
+ iSeed = (int)DateTime.Now.Ticks;
+
+ switch( Args.Length )
+ {
+ case 1:
+ try{
+ iMem = Int32.Parse( Args[0] );
+ }
+ catch(FormatException)
+ {
+ Console.WriteLine("FormatException is caught");
+ }
+ break;
+ case 2:
+ try{
+ iMem = Int32.Parse( Args[0] );
+ iIter = Int32.Parse( Args[1] );
+ }
+ catch(FormatException )
+ {
+ Console.WriteLine("FormatException is caught");
+ }
+ break;
+ case 3:
+ try{
+ iMem = Int32.Parse( Args[0] );
+ iIter = Int32.Parse( Args[1] );
+ iTable = Int32.Parse( Args[2] );
+ }
+ catch(FormatException )
+ {
+ Console.WriteLine("FormatException is caught");
+ }
+ break;
+ case 4:
+ try
+ {
+ iMem = Int32.Parse(Args[0]);
+ iIter = Int32.Parse(Args[1]);
+ iTable = Int32.Parse(Args[2]);
+ iSeed = Int32.Parse(Args[3]);
+ }
+ catch (FormatException)
+ {
+ Console.WriteLine("FormatException is caught");
+ }
+ break;
+ }
+
+ Console.WriteLine("Repro with these values:");
+ Console.WriteLine("iMem= {0} MB, iIter= {1}, iTable={2} iSeed={3}", iMem, iIter, iTable, iSeed );
+
+ LeakWheel mv_obj = new LeakWheel();
+
+
+ if(mv_obj.RunGame())
+ {
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed!");
+ return 1;
+
+ }
+
+ public bool RunGame()
+ {
+ Dictionary<int, WeakReference> oTable = new Dictionary<int, WeakReference>(10);
+ LstNode = null; //the last node in the node chain//
+ Random r = new Random (LeakWheel.iSeed);
+
+ for(int i=0; i<iIter; i++)
+ {
+ LstNode = SpinWheel(oTable, LstNode, r);
+
+ if( GC.GetTotalMemory(false)/(1024*1024) >= iMem )
+ {
+ LstNode = null;
+
+ GC.Collect( );
+ GC.WaitForPendingFinalizers();
+ GC.Collect( );
+
+ Console.WriteLine( "After Delete and GCed all Objects: {0}", GC.GetTotalMemory(false) );
+ }
+ }
+
+ LstNode = null;
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ Thread.Sleep(100);
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+
+ Console.WriteLine("When test finished: {0}", GC.GetTotalMemory(false));
+ Console.WriteLine("Created VarAry objects: {0} Finalized VarAry Objects: {1}", Node.iVarAryCreat, Node.iVarAryFinal);
+ Console.WriteLine("Created BitArray objects: {0} Finalized BitArray Objects: {1}", Node.iBitAryCreat, Node.iBitAryFinal);
+ Console.WriteLine("Created small objects: {0} Finalized small Objects: {1}", Node.iSmallCreat, Node.iSmallFinal);
+ Console.WriteLine("Created BinaryTree objects: {0} Finalized BinaryTree Objects: {1}", Node.iBiTreeCreat, Node.iBiTreeFinal);
+ Console.WriteLine("Created Thread objects: {0} Finalized Thread Objects: {1}", Node.iThrdCreat, Node.iThrdFinal);
+
+
+ return (Node.iBitAryCreat == Node.iBitAryFinal &&
+ Node.iBiTreeCreat == Node.iBiTreeFinal &&
+ Node.iSmallCreat == Node.iSmallFinal &&
+ Node.iThrdCreat == Node.iThrdFinal &&
+ Node.iVarAryCreat == Node.iVarAryFinal);
+ }
+
+ public Node SpinWheel( Dictionary<int, WeakReference> oTable, Node LstNode, Random r )
+ {
+ int iKey;//the index which the new node will be set at
+ Node nValue;//the new node
+ bool bDel;
+
+ //Console.WriteLine( "start spinwheel ");
+
+ iKey = r.Next( 0, LeakWheel.iTable );
+
+ if( iKey%2 == 0 ) //decide whether delete or create a node.
+ bDel = true; //delete
+ else
+ bDel = false;
+
+ if( !bDel )
+ {
+ nValue = CreateNode( iKey );
+
+ if( oTable.ContainsKey(iKey) && (oTable[iKey]).IsAlive )
+ {
+ SetChildNode(oTable, iKey, nValue );
+ }
+ else
+ {
+ LstNode = SetNodeInTable(iKey, nValue, LstNode, oTable);
+ }
+ }
+ else
+ {
+ DeleteNode( iKey, oTable);
+ }
+ //if (iKey % 100 == 0)
+ //{
+ // Console.WriteLine("HeapSize: {0}", GC.GetTotalMemory(false));
+ //}
+ return LstNode;
+ }
+
+ public void DeleteNode( int iKey, Dictionary<int, WeakReference> oTable)
+ {
+ //iSwitch is 0, delete one child Node at iKey;
+ //is 1, del one object and its childred;
+ //is 2, del the object at iKey and all the next objects;
+ //is 3, del the all objects in object chain.
+ int iSwitch = iKey%4;
+ Node thisNode;
+
+ if( oTable.ContainsKey( iKey ) )
+ {
+ WeakReference wRef = oTable[iKey];
+ if( wRef.IsAlive )
+ {
+ thisNode = (Node)wRef.Target;
+ switch( iSwitch )
+ {
+ case 0:
+ Node childNode = thisNode;
+ if( childNode.Child != null )
+ {//delete one child Node at iKey if there is,
+ while( childNode.Child != null )
+ {
+ childNode = childNode.Child;
+ }
+ childNode = childNode.Parent;
+ childNode.Child = null;
+ break;
+ }
+ else goto case 1; //otherwise del this Node in "case 1" (the node is shared with "case 1" );
+ case 1: //del one object and its childred from nodes chain;
+ if( thisNode.Last != null )
+ {
+ thisNode.Last.Next = thisNode.Next;
+ if( thisNode.Next != null )
+ {
+ thisNode.Next.Last = thisNode.Last;
+ }
+ }
+ else
+ {
+ if( thisNode.Next != null )
+ thisNode.Next.Last = null;
+ }
+ break;
+ case 2: //del the object at iKey and all the next objects;
+ if( thisNode.Last != null )
+ thisNode.Last = null;
+ else
+ thisNode = null;
+ break;
+ case 3://del the all objects in object chain.
+ Node Last = thisNode;
+ while( Last.Last != null )
+ {
+ Last = Last.Last;
+ }
+ Last = null;
+ break;
+ }//end of switch
+ }
+ else
+ oTable[iKey] = null;
+ }
+ }
+
+ public Node SetNodeInTable(int iKey, Node nValue, Node LstNode, Dictionary<int, WeakReference> oTable )
+ {
+ /**************************************************/
+ /* save new node in a chain, all the node is */
+ /* refereced by this chain, Table only have their */
+ /* Weakreferece. So when delete a node, only need */
+ /* to delete the ref in this chain. */
+ /**************************************************/
+ if( LstNode == null )
+ LstNode = nValue;
+ else
+ {
+ LstNode.Next = nValue ;
+ LstNode.Next.Last = LstNode;
+ LstNode = LstNode.Next;
+ }
+ WeakReference wRef = new WeakReference( LstNode, false );
+ if( oTable.ContainsKey(iKey) )
+ {
+ oTable[iKey] = wRef;
+ }
+ else
+ {
+ oTable.Add( iKey, wRef );
+ }
+ return LstNode; //keep the last node fresh in chain
+ }
+
+ public void SetChildNode( Dictionary<int, WeakReference> oTable, int iKey, Node nValue )
+ {
+ WeakReference wRef= oTable[iKey];
+ WeakReference wRefChild = wRef;
+ Node thisNode = (Node)wRefChild.Target;
+ Node ChildNode = thisNode;
+
+ while( ChildNode.Child != null )
+ {
+ ChildNode = ChildNode.Child;
+ }
+ ChildNode.Child = nValue;
+ ChildNode.Child.Parent = ChildNode;
+ }
+
+ public Node CreateNode( int iKey )
+ {
+ Node newNode = new Node( );
+ switch( iKey%5 )
+ {
+ //case 0://1 out of 4 nodes are thread node.
+ // newNode.SetThread( );
+ //break;
+ case 1://This node include a binary tree
+ newNode.SettreeNode( iKey );
+ break;
+ case 2: //This node with a Variant array.
+ newNode.SetVararyNode( iKey );
+ break;
+ case 3: //This node with a BitArray
+ newNode.SetBitArrayNode( iKey );
+ break;
+ case 0:
+ case 4: //small node
+ newNode.SetSmallNode( iKey );
+ break;
+ }
+ return newNode;
+ }
+
+ public void ThreadNode()
+ {
+ Dictionary<int, WeakReference> oTable = new Dictionary<int, WeakReference>( 10);
+ Node LstNode = null; //the last node in the node chain//
+ Random r = new Random (LeakWheel.iSeed);
+ LeakWheel mv_obj = new LeakWheel();
+
+ while (true)
+ {
+ LstNode = mv_obj.SpinWheel( oTable, LstNode, r );
+
+ if( GC.GetTotalMemory(false) >= LeakWheel.iMem*60 )
+ {
+ LstNode = null;
+
+ GC.Collect( );
+ GC.WaitForPendingFinalizers();
+ GC.Collect( );
+ Console.WriteLine( "After Delete and GCed all Objects: {0}", GC.GetTotalMemory(false) );
+ }
+ }
+ }
+ }
+
+
+ internal class Node
+ {
+ internal static int iVarAryCreat=0;
+ internal static int iVarAryFinal=0;
+ internal static int iBitAryCreat=0;
+ internal static int iBitAryFinal=0;
+ internal static int iSmallCreat=0;
+ internal static int iSmallFinal=0;
+ internal static int iBiTreeCreat=0;
+ internal static int iBiTreeFinal=0;
+ internal static int iThrdCreat=0;
+ internal static int iThrdFinal=0;
+
+ internal Node Last;
+ internal Node Next;
+ internal Node Parent;
+ internal Node Child;
+// disabling unused variable warning
+#pragma warning disable 0414
+ internal Object vsMem;
+#pragma warning restore 0414
+ internal Thread ThrdNode;
+ internal int itype; //0=VarAry;1=BitAry;2=small;3=binarytree;4=Thread
+
+ public Node()
+ {
+ Last = null;
+ Next = null;
+ Parent = null;
+ Child = null;
+ ThrdNode = null;
+ itype = -1;
+ }
+
+ public void SetVararyNode( int iKey )
+ {
+ int iSize = iKey%30;
+ if (iSize == 0)
+ {
+ iSize = 30;
+ }
+ Object [] VarAry = new Object[iSize];
+ double [] dmem;
+ for( int i=0; i < iSize; i++ )
+ {
+ dmem= new double[1+i];
+ dmem[0] = (double)0;
+ dmem[i] = (double)i;
+ VarAry[i] = ( dmem );
+ }
+
+ vsMem = ( VarAry );
+ itype = 0;
+ AddObjectToRecord();
+ }
+
+ public void SetBitArrayNode( int iKey )
+ {
+ vsMem = ( new BitArray( iKey, true ) );
+ itype = 1;
+ AddObjectToRecord();
+ }
+
+ public void SetSmallNode( int iKey )
+ {
+ itype = 2;
+ AddObjectToRecord();
+ vsMem = ( iKey );
+ }
+
+ public void SettreeNode( int iKey )
+ {
+ itype = 3;
+ AddObjectToRecord();
+ TreeNode nTree = new TreeNode();
+ nTree.Populate(iKey%10, nTree);
+ vsMem = ( nTree );
+ }
+
+ public void SetThread()
+ {
+ itype = 4;
+ AddObjectToRecord();
+ LeakWheel mv_obj = new LeakWheel();
+ mv_obj.ThreadNode();
+ }
+
+
+
+ ~Node()
+ {
+ //that whould be interesting to see what happens if we don't stop the thread
+ //this thread is created in this node, this node go away, this the object chain
+ //is local variable in ThreadNode, it will go away too. What this thread is going to do?
+
+ //if( ThrdNode != null )
+ //{
+ // ThrdNode.Abort();
+ // ThrdNode.Join();
+ //}
+ DelObjectFromRecord( );
+ }
+
+ public void AddObjectToRecord()
+ {
+ lock(this) {
+ switch( itype )
+ {
+ case 0:
+ Node.iVarAryCreat++;
+ break;
+ case 1:
+ Node.iBitAryCreat++;
+ break;
+ case 2:
+ Node.iSmallCreat++;
+ break;
+ case 3:
+ Node.iBiTreeCreat++;
+ break;
+ case 4:
+ Node.iThrdCreat++;
+ break;
+ }
+ }
+ }
+
+ public void DelObjectFromRecord( )
+ {
+ lock(this)
+ {
+ switch( itype )
+ {
+ case 0:
+ Node.iVarAryFinal++;
+ break;
+ case 1:
+ Node.iBitAryFinal++;
+ break;
+ case 2:
+ Node.iSmallFinal++;
+ break;
+ case 3:
+ Node.iBiTreeFinal++;
+ break;
+ case 4:
+ Node.iThrdFinal++;
+ break;
+ }
+ }
+ }
+ }
+
+ internal class TreeNode
+ {
+ internal TreeNode left;
+ internal TreeNode right;
+ internal byte [] mem;
+ public TreeNode() { }
+
+ // Build tree top down, assigning to older objects.
+ internal void Populate(int iDepth, TreeNode thisNode)
+ {
+ if (iDepth<=0)
+ {
+ return;
+ }
+ else
+ {
+ mem = new byte[iDepth];
+ mem[0] = 0;
+ mem[iDepth-1] = (byte)iDepth;
+ iDepth--;
+ thisNode.left = new TreeNode();
+ thisNode.right = new TreeNode();
+ Populate (iDepth, thisNode.left);
+ Populate (iDepth, thisNode.right);
+ }
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/LeakWheel/leakwheel.csproj b/tests/src/GC/Scenarios/LeakWheel/leakwheel.csproj
new file mode 100644
index 0000000000..42b21c21ea
--- /dev/null
+++ b/tests/src/GC/Scenarios/LeakWheel/leakwheel.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="LeakWheel.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/MinLeakGen/app.config b/tests/src/GC/Scenarios/MinLeakGen/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/MinLeakGen/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/MinLeakGen/minleakgen.cs b/tests/src/GC/Scenarios/MinLeakGen/minleakgen.cs
new file mode 100644
index 0000000000..d6b7e4c5b3
--- /dev/null
+++ b/tests/src/GC/Scenarios/MinLeakGen/minleakgen.cs
@@ -0,0 +1,100 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/***************************************************************************
+/*ByteObject is a class to allocate small size of memory. this test creates
+/*two Large size of ByteObject arrays, then delete all the reference in the
+/* arrays to make millions(iObj) of small leaks to see if GC can handle so
+/*many leaks at same time. ByteObject's size is variable.
+/****************************************************************************/
+namespace DefaultNamespace {
+ using System;
+
+ public class MinLeakGen
+ {
+ internal static ByteObject []Mv_Obj = new ByteObject[1024*5];
+ internal static ByteObject []Mv_Obj1 = new ByteObject[1024*5];
+ public static int Main(System.String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0; //the number of Mb will be allocated in MakeLeak();
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 5;
+ }
+ break;
+
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 5;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 1024*5;
+ }
+ break;
+
+ default:
+ iRep = 5;
+ iObj = 1024*5;
+ break;
+
+ }
+
+ MinLeakGen Mv_Leak = new MinLeakGen();
+ if(Mv_Leak.runTest(iRep, iObj ))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+ for(int i = 0; i<iRep; i++)
+ {
+ MakeLeak(iObj);
+ }
+ return true;
+ }
+
+ public void MakeLeak(int iObj)
+ {
+ for(int i=0; i<iObj; i++)
+ {
+ Mv_Obj[i] = new ByteObject(i/10+1);
+ Mv_Obj1[i] = new ByteObject(i/10+1);
+ }
+ for(int i=0; i<iObj; i++)
+ {
+ Mv_Obj[i] = null;
+ Mv_Obj1[i] = null;
+ }
+ }
+
+ }
+
+ public class ByteObject
+ {
+ internal byte[] min;
+ public ByteObject(int size)
+ {
+ min = new byte[size];
+ min[0] = 1;
+ min[size - 1] = 2;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/MinLeakGen/minleakgen.csproj b/tests/src/GC/Scenarios/MinLeakGen/minleakgen.csproj
new file mode 100644
index 0000000000..abf3dbdfff
--- /dev/null
+++ b/tests/src/GC/Scenarios/MinLeakGen/minleakgen.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="MinLeakGen.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/NDPin/app.config b/tests/src/GC/Scenarios/NDPin/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/NDPin/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/NDPin/ndpin.cs b/tests/src/GC/Scenarios/NDPin/ndpin.cs
new file mode 100644
index 0000000000..43089ad37c
--- /dev/null
+++ b/tests/src/GC/Scenarios/NDPin/ndpin.cs
@@ -0,0 +1,53 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System;
+ using System.Runtime.InteropServices;
+
+ internal class NDPin
+ {
+
+ internal Object p;
+ internal static NDPin m_n;
+ internal static Object m_o;
+
+ internal NDPin (Object p)
+ {
+ this.p = p;
+ }
+
+ public static int Main(String [] args)
+ {
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ m_o = new int[10];
+ GCHandle h = GCHandle.Alloc(m_o, GCHandleType.Pinned);
+
+ for (int i = 0; i < 100000; i++)
+ {
+
+ m_o = new int[10];
+ m_n = new NDPin (m_o);
+ h.Free();
+ h = GCHandle.Alloc(m_o, GCHandleType.Pinned);
+ }
+
+ GC.Collect();
+
+ bool result = (m_o == m_n.p);
+ h.Free();
+
+ if (result)
+ {
+ Console.WriteLine ("Test Passed");
+ return 100;
+ }
+ Console.WriteLine ("Test Failed");
+ return 1;
+ }
+
+ }
+
+}
diff --git a/tests/src/GC/Scenarios/NDPin/ndpin.csproj b/tests/src/GC/Scenarios/NDPin/ndpin.csproj
new file mode 100644
index 0000000000..d39984c8e0
--- /dev/null
+++ b/tests/src/GC/Scenarios/NDPin/ndpin.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="NDPin.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/NDPin/ndpinfinal.cs b/tests/src/GC/Scenarios/NDPin/ndpinfinal.cs
new file mode 100644
index 0000000000..1cb5e0ee5b
--- /dev/null
+++ b/tests/src/GC/Scenarios/NDPin/ndpinfinal.cs
@@ -0,0 +1,125 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/******************************************************************/
+/*Test: NDPinFinal
+/*Purpose: check if GC works fine with PInvoke Pinned Object APIs
+/*coverage: GetPinnedHandle(); FreePinnedHandle(); GetPinnedObject()
+/* Finalize
+/******************************************************************/
+
+namespace DefaultNamespace {
+
+ using System;
+ using System.Collections.Generic;
+ using System.Runtime.InteropServices;
+
+ internal class NDPinFinal
+ {
+ internal Object p;
+ internal GCHandle handle;
+
+ internal NDPinFinal (Object p, GCHandle h)
+ {
+ this.p = p;
+ handle = h;
+ NDPinFinal.cCreatObj++;
+ }
+
+ ~NDPinFinal()
+ {
+ if (handle.IsAllocated)
+ {
+ NDPinFinal.pinList[cFinalObj] = handle.Target;
+ }
+ handle.Free();
+ NDPinFinal.cFinalObj++;
+ }
+
+ internal static NDPinFinal m_n;
+ internal static Object m_o;
+ internal static Object[] pinList = null;
+ internal static int cFinalObj = 0;
+ internal static int cCreatObj = 0;
+
+
+ public static void CreateObj(int iObj) {
+
+ pinList = new Object[iObj];
+ m_o = new int[100];
+ for (int i = 0; i < iObj; i++)
+ {
+ m_o = new int[100];
+ m_n = new NDPinFinal (m_o, GCHandle.Alloc(m_o, GCHandleType.Pinned));
+ }
+ }
+
+ public static bool RunTest(int iObj)
+ {
+
+ GC.Collect();
+ if (m_o != m_n.p)
+ {
+ return false;
+ }
+
+ m_n = null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ for( int i=0; i< iObj; i++ )
+ {
+ pinList[i] = null;
+ }
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ if( cFinalObj == cCreatObj )
+ {
+ return true;
+ }
+ else
+ {
+ Console.Write(cCreatObj-cFinalObj);
+ Console.WriteLine (" objects have been finalized!" );
+ return false;
+ }
+
+ }
+
+ public static int Main( String [] args )
+ {
+ int iObj = 1000;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ if( args.Length >= 1 )
+ {
+ try
+ {
+ iObj = Int32.Parse( args[0] );
+ }
+ catch (FormatException)
+ {
+ Console.WriteLine("Format exception");
+ return 1;
+ }
+ }
+
+
+
+ CreateObj(iObj);
+ if (RunTest(iObj))
+ {
+ Console.WriteLine("Test Passed!");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed!");
+ return 1;
+
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/NDPin/ndpinfinal.csproj b/tests/src/GC/Scenarios/NDPin/ndpinfinal.csproj
new file mode 100644
index 0000000000..e730421cb1
--- /dev/null
+++ b/tests/src/GC/Scenarios/NDPin/ndpinfinal.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="NDPinFinal.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/RanCollect/app.config b/tests/src/GC/Scenarios/RanCollect/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/RanCollect/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/RanCollect/rancollect.cs b/tests/src/GC/Scenarios/RanCollect/rancollect.cs
new file mode 100644
index 0000000000..2697609b4f
--- /dev/null
+++ b/tests/src/GC/Scenarios/RanCollect/rancollect.cs
@@ -0,0 +1,377 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**************************************************************************
+/*Test: RanCollect
+/*args: iRep--the repeat times of alloc and delete
+/* iObj--max elements' number for every collection object
+/* iBigSize -- max Bignode's size. (10 <-->4MB)
+/* iSeed -- seed of random generator, for getting random elements' number
+/*Description:This test use collection objects (L_ArrList2, L_Queue, L_ArrList1) and
+/* Variant(L_Vart). It has iRep loops. Inside every loop, create random number
+/* elements in Collection Objects and Variant Object.every element's size
+/* is random, from 0 to iBigSize*iBigSize*10*4KB, for very loop, it also
+/* delete random number elements or all the objects. samply change the four
+/* arguments, you can get handreds of GC condition.
+/****************************************************************************/
+
+namespace DefaultNamespace {
+ using System;
+ //using System.Collections.Generic;
+
+ internal class RanCollect
+ {
+ public static int Main(String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+ int iBigSize = 0;
+ int iSeed = 0;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ if (Args.Length == 4)
+ {
+ if (!Int32.TryParse( Args[0], out iRep) ||
+ !Int32.TryParse( Args[1], out iObj) ||
+ !Int32.TryParse( Args[2], out iBigSize ) ||
+ !Int32.TryParse( Args[3], out iSeed ) )
+ {
+ return 1;
+ }
+ }
+ else
+ {
+ iRep = 10;
+ iObj = 100;
+ iBigSize = 2;
+ iSeed = 49;
+ }
+
+ if(iObj <= 10)
+ {
+ Console.WriteLine("the second argument must be larger than 10.");
+ return 1;
+ }
+
+ Console.Write("iRep= ");
+ Console.Write(iRep);
+ Console.Write(" ; iObj= ");
+ Console.Write(iObj);
+ Console.Write(" ; iBigSize=");
+ Console.Write(iBigSize);
+ Console.Write(" ; iSeed = ");
+ Console.WriteLine(iSeed);
+
+ RanCollect Mv_Obj = new RanCollect();
+
+ if(Mv_Obj.runTest(iRep, iObj, iBigSize, iSeed))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+
+ public virtual bool runTest(int iRep, int iObj, int iBigSize, int iSeed)
+ {
+
+ ArrayList L_ArrList1 = new ArrayList(); //whose node is big double link object (DoubLinkBig).
+ ArrayList L_ArrList2 = new ArrayList(); //whose node is MinNode .
+ Queue L_Queue = new Queue(); //Whose node is DLRanBigNode.
+ Random r = new Random(iSeed);
+
+ int num = r.Next (10, iObj-1);
+ int delnum;
+ Object [] L_Vart = null;
+
+ Console.Write(num);
+ Console.WriteLine (" number's elements in collection objects");
+ for(int i=0; i<iRep;i++)
+ {
+ /*allocate memory*/
+ L_Vart = new Object[num];
+
+ for(int j=0; j<num; j++)
+ {
+ int Size= r.Next(3, num); //the size of nodes.
+ /*L_ArrList1 element's size is from 0 to iBigSize*iBigSize*10*4KB*/
+ L_ArrList1.Add(new DoubLinkBig(r.Next(iBigSize)));
+
+ /*L_ArrList2 element's size is Size number bytes;*/
+ L_ArrList2.Add( new MinNode(Size));
+
+ /*L_Queue element's size is from 0 to 1M*/
+ L_Queue.Enqueue(new DLRanBigNode(250, null, null));
+
+ if(j%6==0)
+ {
+ L_Vart[j] = (new DLRanBigNode(250, null, null));
+ }
+ else
+ {
+ L_Vart[j] = (new MinNode(Size));
+ }
+
+ L_ArrList1.RemoveAt(0);
+ }
+
+ /*start to make leak*/
+
+ if(r.Next(1, iRep)/3 == 0 || num < iObj/8) //learn all the nodes
+ {
+ num = r.Next(10, iObj-1);
+
+ L_ArrList1 = new ArrayList(); //whose node is big double link object (DoubLinkBig).
+ L_ArrList2 = new ArrayList(); //whose node is MinNode .
+ L_Queue = new Queue(); //Whose node is DLRanBigNode.
+ Console.WriteLine("all objects were deleted at the end of loop {0}",i);
+ Console.WriteLine ("{0} number's elements in every collection objects in loop {1}", num, (i+1));
+ }
+ else
+ {
+ if (L_ArrList2.Count <=1)
+ {
+ delnum = 1;
+ }
+ else
+ {
+ delnum = r.Next (1, L_ArrList2.Count); //going to delete delnum nodes
+ }
+
+ if (delnum > (L_ArrList2.Count*3/4))
+ {
+ delnum = L_ArrList2.Count/2;
+ }
+ num = L_ArrList2.Count - delnum; //going to add num nodes
+
+ for(int j=0; j<delnum; j++)
+ {
+ L_ArrList2.RemoveAt(0);
+ L_Queue.Dequeue();
+ }
+ Console.WriteLine("{0} were deleted in each collections at the end of loop {1}", delnum, i);
+ Console.WriteLine ("{0} elements in each collection objects in loop ", num*2, (i+1));
+
+ }
+
+ }
+
+ return true;
+ }
+ }
+
+ public class DoubLinkBig
+ {
+ internal DLRanBigNode[] Mv_DLink;
+ internal int NodeNum;
+ public DoubLinkBig(int Num)
+ {
+ NodeNum = Num;
+ Mv_DLink = new DLRanBigNode[Num];
+
+ if (Num == 0)
+ {
+ return;
+ }
+
+ if (Num == 1)
+ {
+ Mv_DLink[0] = new DLRanBigNode(Num * 10, Mv_DLink[0], Mv_DLink[0]);
+ return;
+ }
+
+ Mv_DLink[0] = new DLRanBigNode(Num * 10, Mv_DLink[Num - 1], Mv_DLink[1]);
+ for (int i = 1; i < Num - 1; i++)
+ {
+ Mv_DLink[i] = new DLRanBigNode(Num * 10, Mv_DLink[i - 1], Mv_DLink[i + 1]);
+ }
+ Mv_DLink[Num - 1] = new DLRanBigNode(Num * 10, Mv_DLink[Num - 2], Mv_DLink[0]);
+
+ }
+
+ public virtual int GetNodeNum()
+ {
+ return NodeNum;
+ }
+ }
+
+ internal class MinNode
+ {
+ public MinNode(int size)
+ {
+
+ byte[] obj = new byte[size];
+
+ if (size > 0)
+ {
+ obj[0] = (byte)10;
+ if (size > 1)
+ {
+ obj[size - 1] = (byte)11;
+ }
+ }
+
+ }
+ }
+
+ public class DLRanBigNode
+ {
+ // disabling unused variable warning
+#pragma warning disable 0414
+ internal DLRanBigNode Last;
+ internal DLRanBigNode Next;
+ internal int[] Size;
+#pragma warning restore 0414
+
+ internal static int FACTOR = 1024;
+
+ public DLRanBigNode(int SizeNum, DLRanBigNode LastObject, DLRanBigNode NextObject)
+ {
+ Last = LastObject;
+ Next = NextObject;
+ Random r = new Random(10);
+ Size = new int[FACTOR * r.Next(SizeNum)];
+ }
+ }
+
+
+ //Queue implemented as a circular array
+ class Queue
+ {
+ int m_Capacity = 20; //default capacity
+ int m_Size = 0;
+ Object[] m_Array;
+ int m_First = 0;
+ int m_Last = -1;
+
+ public Queue()
+ {
+ m_Array = new Object[m_Capacity];
+ }
+ public Queue(int capacity)
+ {
+ m_Capacity = capacity;
+ m_Array = new Object[m_Capacity];
+ }
+ public int Count
+ {
+ get
+ {
+ return m_Size;
+ }
+ }
+
+ public void Enqueue(Object obj)
+ {
+ if(m_Size >= m_Capacity) //array full; increase capacity
+ {
+ int newCapacity = m_Capacity * 2;
+ Object[] newArray = new Object[newCapacity];
+
+ int current = m_First;
+ for (int i = 0; i < m_Size; i++)
+ {
+ newArray[0] = m_Array[current];
+ current = (current+1) % m_Capacity;
+ }
+ m_Array = newArray;
+ m_First = 0;
+ m_Last = m_Size - 1;
+ m_Capacity = newCapacity;
+ }
+
+ m_Last++;
+ if(m_Last == m_Capacity) //wrap around
+ m_Last = m_Last % m_Capacity;
+ m_Array[m_Last] = obj;
+ m_Size++;
+ }
+
+ public Object Dequeue()
+ {
+ if (m_Size == 0)
+ throw new InvalidOperationException();
+
+ Object returnObject = m_Array[m_First];
+ m_Array[m_First] = null;
+ m_First = (m_First+1) % m_Capacity;
+ m_Size--;
+ return returnObject;
+ }
+ }
+
+ class ArrayList
+ {
+ int m_Capacity = 20; //default capacity
+ int m_Size = 0;
+ Object[] m_Array;
+
+ public ArrayList()
+ {
+ m_Array = new Object[m_Capacity];
+ }
+ public ArrayList(int capacity)
+ {
+ m_Capacity = capacity;
+ m_Array = new Object[m_Capacity];
+ }
+
+ public int Count
+ {
+ get
+ {
+ return m_Size;
+ }
+ }
+
+ public int Capacity
+ {
+ get
+ {
+ return m_Capacity;
+ }
+ }
+
+ //Add an Object; returns the array index at which the object was added;
+ public int Add(Object obj)
+ {
+
+ if (m_Size >= m_Capacity) //increase capacity
+ {
+ int newCapacity = m_Capacity * 2;
+ Object[] newArray = new Object[newCapacity];
+ for (int i = 0; i < m_Size; i++)
+ {
+ newArray[i] = m_Array[i];
+ }
+ m_Array = newArray;
+ m_Capacity = newCapacity;
+ }
+
+
+ m_Array[m_Size] = obj;
+ m_Size++;
+ return (m_Size - 1);
+
+ }
+
+ public void RemoveAt(int position)
+ {
+ if (position < 0 || position >= m_Size)
+ throw new ArgumentOutOfRangeException();
+
+ m_Array[position] = null;
+
+ //shift elements to fill the empty slot
+ for (int i = position; i < m_Size-1; i++)
+ {
+ m_Array[i] = m_Array[i + 1];
+ }
+ m_Size--;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/RanCollect/rancollect.csproj b/tests/src/GC/Scenarios/RanCollect/rancollect.csproj
new file mode 100644
index 0000000000..8757338291
--- /dev/null
+++ b/tests/src/GC/Scenarios/RanCollect/rancollect.csproj
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>7 40 4 77</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="RanCollect.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/ReflectObj/app.config b/tests/src/GC/Scenarios/ReflectObj/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/ReflectObj/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/ReflectObj/reflectobj.cs b/tests/src/GC/Scenarios/ReflectObj/reflectobj.cs
new file mode 100644
index 0000000000..b3cc55b25c
--- /dev/null
+++ b/tests/src/GC/Scenarios/ReflectObj/reflectobj.cs
@@ -0,0 +1,132 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**************************************************************/
+/* TEST: ReflectObj
+/* Purpose: test if GC can handle objects create by reflect
+/* Coverage: Class.CreateInstance()
+/* Class.GetField()
+/* Class.GetConstructor()
+/* ConstructorInfo.Invoke()
+/* FieldInfo.SetValue()
+/* FieldInfo.IsStatic()
+/* FieldInfo.Ispublic()
+/**************************************************************/
+
+namespace App {
+ using System;
+ using System.Reflection;
+ using System.Collections.Generic;
+
+ class ReflectObj
+ {
+ Object obj;
+ public static int icCreat = 0;
+ public static int icFinal = 0;
+ public static List<object> al = new List<object>( );
+ public ReflectObj()
+ {
+ obj = new long[1000];
+ icCreat++;
+ }
+
+ public ReflectObj( int l )
+ {
+ obj = new long[l];
+ icCreat++;
+ }
+
+ public Object GetObj()
+ {
+ return obj;
+ }
+
+ ~ReflectObj()
+ {
+ al.Add( GetObj() );
+ icFinal++;
+ }
+
+ public static int Main( String [] str )
+ {
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ CreateObj temp = new CreateObj();
+ if (temp.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+ class CreateObj
+ {
+ private Object[] v;
+ private Type myClass;
+ private Type [] rtype;
+ private ConstructorInfo CInfo;
+
+ public CreateObj()
+ {
+ myClass = Type.GetType( "App.ReflectObj" );
+ v = new Object[1];
+ for( int i=0; i< 2000; i++ )
+ {
+ v[0] = i;
+ Activator.CreateInstance(myClass, v );
+ }
+ }
+
+ public bool RunTest()
+ {
+ bool retVal = false;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ Console.WriteLine("Created Objects: {0} Finalized objects: {1}",icCreat, icFinal );
+ if ( icFinal != icCreat )
+ {
+ return false;
+ }
+
+ FieldInfo fInfo = myClass.GetField( "icCreat", BindingFlags.IgnoreCase);
+ fInfo = myClass.GetField( "icFinal", BindingFlags.IgnoreCase);
+
+ Console.WriteLine( "Fieldinfo done" ); //debug;
+
+ CreateMoreObj();
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ retVal = (icFinal == icCreat );
+
+ Console.WriteLine("Living objects: "+ ReflectObj.al.Count );
+ ReflectObj.al = null;
+
+ return retVal;
+
+ }
+
+ public void CreateMoreObj()
+ {
+ rtype = new Type[0];
+ CInfo = myClass.GetConstructor(rtype );
+
+ for( int i=0; i< 2000; i++ )
+ {
+ CInfo.Invoke((Object[])null );
+ }
+ }
+
+
+ }
+
+
+ }
+
+}
diff --git a/tests/src/GC/Scenarios/ReflectObj/reflectobj.csproj b/tests/src/GC/Scenarios/ReflectObj/reflectobj.csproj
new file mode 100644
index 0000000000..80af403b9a
--- /dev/null
+++ b/tests/src/GC/Scenarios/ReflectObj/reflectobj.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="ReflectObj.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Resurrection/app.config b/tests/src/GC/Scenarios/Resurrection/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/Resurrection/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/Resurrection/continue.cs b/tests/src/GC/Scenarios/Resurrection/continue.cs
new file mode 100644
index 0000000000..f071a55658
--- /dev/null
+++ b/tests/src/GC/Scenarios/Resurrection/continue.cs
@@ -0,0 +1,139 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System;
+
+
+ internal class Continue
+ {
+// disabling unused variable warning
+#pragma warning disable 0414
+ internal static Object StObj;
+
+ public class CreateObj
+ {
+ BNode obj;
+#pragma warning restore 0414
+ public CreateObj()
+ {
+ Continue mv_Obj = new Continue();
+
+ for( int i=1; i< 1000; i++)
+ {
+ obj = new BNode(i); //create new one and delete the last one.
+ mv_Obj.CreateNode( i ); //create locate objects in createNode().
+ }
+
+ Console.Write(BNode.icCreateNode);
+ Console.WriteLine(" Nodes were created.");
+ }
+
+
+ public bool RunTest()
+ {
+ obj = null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ Console.Write(BNode.icFinalNode);
+ Console.WriteLine(" Nodes were finalized and resurrected.");
+
+ for (int i = 0; i < BNode.rlNodeCount; i++)
+ {
+ BNode oldNode = (BNode)BNode.rlNode[i];
+ if ( oldNode.mem[0] != 99 )
+ {
+ Console.WriteLine( "One Node is not resurrected correctly.");
+ }
+ oldNode = null;
+ BNode.rlNode[ i ] = null;
+ }
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ return ( BNode.icCreateNode == BNode.icFinalNode );
+
+ }
+
+ }
+
+ public static int Main()
+ {
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ CreateObj temp = new CreateObj();
+
+ if(temp.RunTest())
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+
+ ~Continue()
+ {
+ Continue.StObj = ( this );
+ Console.WriteLine( "Main class Finalize().");
+
+ }
+
+ public void CreateNode( int i )
+ {
+ BNode rgobj = new BNode( i );
+ }
+ }
+
+
+ internal class BNode
+ {
+ public static int icCreateNode = 0;
+ public static int icFinalNode = 0;
+ public static int rlNodeCapacity = 2000;
+ public static int rlNodeCount = 0;
+ internal static BNode[] rlNode = new BNode[rlNodeCapacity];
+ public int [] mem;
+ public BNode( int i )
+ {
+
+ icCreateNode++;
+
+ mem = new int[i];
+ mem[0] = 99;
+ if(i > 1 )
+ {
+ mem[mem.Length-1] = mem.Length-1;
+ }
+
+
+ }
+
+
+ ~BNode()
+ {
+ icFinalNode++;
+
+ //resurrect objects
+ if (rlNodeCount == rlNodeCapacity)
+ {
+ rlNodeCapacity = rlNodeCapacity * 2;
+ BNode[] newrlNode = new BNode[rlNodeCapacity*2];
+
+ for (int i = 0; i < rlNodeCount; i++)
+ {
+ newrlNode[i] = rlNode[i];
+ }
+ rlNode = newrlNode;
+ }
+ rlNode[rlNodeCount] = this;
+ rlNodeCount++;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/Resurrection/continue.csproj b/tests/src/GC/Scenarios/Resurrection/continue.csproj
new file mode 100644
index 0000000000..ee75dc4ec8
--- /dev/null
+++ b/tests/src/GC/Scenarios/Resurrection/continue.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="Continue.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Rootmem/app.config b/tests/src/GC/Scenarios/Rootmem/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/Rootmem/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/Rootmem/rootmem.cs b/tests/src/GC/Scenarios/Rootmem/rootmem.cs
new file mode 100644
index 0000000000..b11d6d5a2a
--- /dev/null
+++ b/tests/src/GC/Scenarios/Rootmem/rootmem.cs
@@ -0,0 +1,91 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*******************************************************************/
+/* Test: RootMem
+/* Purpose: Test if Root class manage memory correctly against GC
+/* Coverage: Root.Alloc(), Root.Free(), Root.Get()
+/*******************************************************************/
+
+namespace DefaultNamespace {
+ using System;
+ using System.Runtime.InteropServices;
+
+ internal class RootMem
+ {
+ internal long [] l;
+ internal static GCHandle [] root;
+ internal static int n;
+
+ public static int Main( String [] args )
+ {
+ int iSize = 1000;
+ Object [] arVar = new Object[iSize];
+ root = new GCHandle[iSize];
+ RootMem rm_obj;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ for( n=0; n< iSize; n++ )
+ {
+ rm_obj = new RootMem( n );
+ root[n] = GCHandle.Alloc(rm_obj );
+ }
+ //Console.WriteLine("After save objects to Root and before GCed: "+GC.GetTotalMemory(false) );
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+ //Console.WriteLine("After save objects to Root and after GCed: "+GC.GetTotalMemory(false) );
+
+ Object v;
+ for( int i=0; i< iSize; i++)
+ {
+ v = ( root[i]) ;
+ }
+ //Console.WriteLine("After Get objects from root and before GCed: "+GC.GetTotalMemory(false) );
+ GC.Collect();
+ //Console.WriteLine("After Get objects from root and after GCed: "+GC.GetTotalMemory(false) );
+
+ for( int i=0; i<iSize; i++ )
+ {
+ root[i].Free();
+ }
+ //Console.WriteLine("After free root and before GCed: "+GC.GetTotalMemory(false) );
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+ //Console.WriteLine("After free root and after GCed: "+GC.GetTotalMemory(false) );
+ try
+ {
+ for( int i=0; i<iSize; i++ )
+ {
+ arVar[i]= ( root[i].Target );
+ }
+ }
+ catch(System.InvalidOperationException)
+ {
+ //expected exception is throw after gchandles were free
+ Console.WriteLine("test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("test failed");
+ return 1;
+ }
+
+ public RootMem( int i )
+ {
+ if( i> 0)
+ {
+ l = new long[i];
+ l[0] = 0;
+ l[i-1] = i;
+ }
+ }
+
+ ~RootMem()
+ {
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/Rootmem/rootmem.csproj b/tests/src/GC/Scenarios/Rootmem/rootmem.csproj
new file mode 100644
index 0000000000..4cdf6f244a
--- /dev/null
+++ b/tests/src/GC/Scenarios/Rootmem/rootmem.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="RootMem.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/Samples/app.config b/tests/src/GC/Scenarios/Samples/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/Samples/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/Samples/gc.cs b/tests/src/GC/Scenarios/Samples/gc.cs
new file mode 100644
index 0000000000..a6c1cfeb54
--- /dev/null
+++ b/tests/src/GC/Scenarios/Samples/gc.cs
@@ -0,0 +1,532 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*=====================================================================
+ File: GC.cs
+
+ Summary: Demonstrates how the garbage collector works.
+
+---------------------------------------------------------------------
+ This file is part of the Microsoft COM+ 2.0 SDK Code Samples.
+
+ Copyright (C) 2000 Microsoft Corporation. All rights reserved.
+
+This source code is intended only as a supplement to Microsoft
+Development Tools and/or on-line documentation. See these other
+materials for detailed information regarding Microsoft code samples.
+
+THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+PARTICULAR PURPOSE.
+=====================================================================*/
+
+
+// Add the classes in the following namespaces to our namespace
+using System;
+using System.Threading;
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+// Note that deriving from Object is optional since it is always implied
+public class BaseObj : Object {
+ private String name; // Each object has a name to help identify it
+
+ // Note that explicitly calling the base class's constructor is
+ // optional since the compiler ensures it anyway.
+ // Also note that there is no concept of a destructor.
+ public BaseObj(String name) : base() {
+ this.name = name;
+ Display("BaseObj Constructor");
+ }
+
+ public void Display(String status) {
+ Application.Display(String.Format("Obj({0}): {1}", name, status));
+ }
+
+ // A Finalize method is the closest thing to a destructor but many of the
+ // semantics are different. The demos in this application demonstrate this.
+ //protected override void Finalize() {
+ ~BaseObj() {
+ Display("BaseObj Finalize");
+
+ // If possible, do not have a Finalize method for your class. Finalize
+ // methods usually run when the heap is low on available storage
+ // and needs to be garbage collected. This can hurt application
+ // performance significantly.
+
+ // If you must implement a Finalize method, make it run fast, avoid
+ // synchronizing on other threads, do not block, and
+ // avoid raising any exceptions (although the Finalizer thread
+ // automatically recovers from any unhandled exceptions).
+
+ // NOTE: In the future, exceptions may be caught using an
+ // AppDomain-registered unhandled Finalize Exception Handler
+
+ // While discouraged, you may call methods on object's referred
+ // to by this object. However, you must be aware that the other
+ // objects may have already had their Finalize method called
+ // causing these objects to be in an unpredictable state.
+ // This is because the system does not guarantees that
+ // Finalizers will be called in any particular order.
+ }
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+// This class shows how to derive a class from another class and how base class
+// Finalize methods are NOT automatically called. By contrast, base class
+// destructors (in unmanaged code) are automatically called.
+// This is one example of how destructors and Finalize methods differ.
+public class DerivedObj : BaseObj {
+ public DerivedObj(String s) : base(s) {
+ Display("DerivedObj Constructor");
+ }
+
+ //protected override void Finalize() {
+ ~DerivedObj() {
+ Display("DerivedObj Finalize");
+
+ // The GC has a special thread dedicated to executing Finalize
+ // methods. You can tell that this thread is different from the
+ // application's main thread by comparing the thread's hash codes.
+ Display("Finalize thread's hash code: "
+ + Thread.CurrentThread.GetHashCode());
+
+ // BaseObj's Finalize is NOT called unless you execute the line below
+ // base.Finalize(); //commented by vaishak due to breaking change
+ }
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+// This class shows how an object can resurrect itself
+public class ResurrectObj : BaseObj {
+
+ // Indicates if object should resurrect itself when collected
+ private Boolean allowResurrection = true; // Assume resurrection
+
+ public ResurrectObj(String s) : base(s) {
+ Display("ResurrectObj Constructor");
+ }
+
+ public void SetResurrection(Boolean allowResurrection) {
+ this.allowResurrection = allowResurrection;
+ }
+
+ //protected override void Finalize() {
+ ~ResurrectObj() {
+ Display("ResurrectObj Finalize");
+ if (allowResurrection) {
+ Display("This object is being resurrected");
+ // Resurrect this object by making something refer to it
+ Application.ResObjHolder = this;
+
+ // When the GC calls an object's Finalize method, it assumes that
+ // there is no need to ever call it again. However, we've now
+ // resurrected this object and the line below forces the GC to call
+ // this object's Finalize again when the object is destroyed again.
+ // BEWARE: If ReRegisterForFinalize is called multiple times, the
+ // object's Finalize method will be called multiple times.
+ GC.ReRegisterForFinalize(this);
+
+ // If this object contains a member referencing another object,
+ // The other object may have been finalized before this object
+ // gets resurrected. Note that resurrecting this object forces
+ // the referenced object to be resurrected as well. This object
+ // can continue to use the referenced object even though it was
+ // finalized.
+
+ } else {
+ Display("This object is NOT being resurrected");
+ }
+ }
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+// This class shows how the GC improves performance using generations
+public class GenObj : BaseObj {
+ public GenObj(String s) : base(s) {
+ Display("GenObj Constructor");
+ }
+
+ public void DisplayGeneration() {
+ Display(String.Format("Generation: {0}", GC.GetGeneration(this)));
+ }
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+// This class shows the proper way to implement explicit cleanup.
+public class DisposeObj : BaseObj {
+ public DisposeObj(String s) : base(s) {
+ Display("DisposeObj Constructor");
+ }
+
+ // When an object of this type wants to be explicitly cleaned-up, the user
+ // of this object should call Dispose at the desired code location.
+ public void Dispose() {
+ Display("DisposeObj Dispose");
+ // Usually Dispose() calls Finalize so that you can
+ // implement all the cleanup code in one place.
+ // Finalize(); //commented by vaishak due to breaking change
+
+ // Tell the garbage collector that the object doesn't require any
+ // cleanup when collected since Dispose was called explicitly.
+ GC.SuppressFinalize(this);
+ }
+
+ // Put the object cleanup code in the Finalize method
+ //protected override void Finalize() {
+ ~DisposeObj(){
+ Display("DisposeObj Finalize");
+ // This function can be called by Dispose() or by the GC
+ // If called by Dispose, the application's thread executes this code
+ // If called by the GC, then a special GC thread executes this code
+ }
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+// This class represents the application itself
+class Application {
+ static private int indent = 0;
+
+ static public void Display(String s) {
+ for (int x = 0; x < indent * 3; x++)
+ Console.Write(" ");
+ Console.WriteLine(s);
+ }
+
+ static public void Display(int preIndent, String s, int postIndent) {
+ indent += preIndent;
+ Display(s);
+ indent += postIndent;
+ }
+
+ static public void Collect() {
+ Display(0, "Forcing a garbage collection", 0);
+ GC.Collect();
+ }
+
+ static public void Collect(int generation) {
+ Display(0, "Forcing a garbage collection of generation " + generation, 0);
+ GC.Collect(generation);
+ }
+
+ static public void WaitForFinalizers() {
+ Display(0, "Waiting for Finalizers to complete", +1);
+ GC.WaitForPendingFinalizers();
+ Display(-1, "Finalizers are complete", 0);
+ }
+
+ // This method demonstrates how the GC works.
+ private static void Introduction() {
+ Display(0, "\n\nDemo start: Introduction to Garbage Collection.", +1);
+
+ // Create a new DerivedObj in the managed heap
+ // Note: Both BaseObj and DerivedObj constructors are called
+ DerivedObj obj = new DerivedObj("Introduction");
+
+ obj = null; // We no longer need this object
+
+ // The object is unreachable so forcing a GC causes it to be finalized.
+ Collect();
+
+ // Wait for the GC's Finalize thread to finish
+ // executing all queued Finalize methods.
+ WaitForFinalizers();
+ // NOTE: The GC calls the most-derived (farthest away from
+ // the Object base class) Finalize only.
+ // Base class Finalize functions are called only if the most-derived
+ // Finalize method explicitly calls its base class's Finalize method.
+
+ // This is the same test as above with one slight variation
+ obj = new DerivedObj("Introduction");
+ // obj = null; // Variation: this line is commented out
+ Collect();
+ WaitForFinalizers();
+ // Notice that we get identical results as above: the Finalize method
+ // runs because the jitter's optimizer knows that obj is not
+ // referenced later in this function.
+
+ Display(-1, "Demo stop: Introduction to Garbage Collection.", 0);
+ }
+
+
+ // This reference is accessed in the ResurrectObj.Finalize method and
+ // is used to create a strong reference to an object (resurrecting it).
+ static public ResurrectObj ResObjHolder; // Defaults to null
+
+
+ // This method demonstrates how the GC supports resurrection.
+ // NOTE: Resurrection is discouraged.
+ private static void ResurrectionDemo() {
+ Display(0, "\n\nDemo start: Object Resurrection.", +1);
+
+ // Create a ResurrectionObj
+ ResurrectObj obj = new ResurrectObj("Resurrection");
+
+ // Destroy all strong references to the new ResurrectionObj
+ obj = null;
+
+ // Force the GC to determine that the object is unreachable.
+ Collect();
+ WaitForFinalizers(); // You should see the Finalize method called.
+
+ // However, the ResurrectionObj's Finalize method
+ // resurrects the object keeping it alive. It does this by placing a
+ // reference to the dying-object in Application.ResObjHolder
+
+ // You can see that ResurrectionObj still exists because
+ // the following line doesn't raise an exception.
+ ResObjHolder.Display("Still alive after Finalize called");
+
+ // Prevent the ResurrectionObj object from resurrecting itself again,
+ ResObjHolder.SetResurrection(false);
+
+ // Now, let's destroy this last reference to the ResurrectionObj
+ ResObjHolder = null;
+
+ // Force the GC to determine that the object is unreachable.
+ Collect();
+ WaitForFinalizers(); // You should see the Finalize method called.
+ Display(-1, "Demo stop: Object Resurrection.", 0);
+ }
+
+
+ // This method demonstrates how to implement a type that allows its users
+ // to explicitly dispose/close the object. For many object's this paradigm
+ // is strongly encouranged.
+ private static void DisposeDemo() {
+ Display(0, "\n\nDemo start: Disposing an object versus Finalize.", +1);
+ DisposeObj obj = new DisposeObj("Explicitly disposed");
+ obj.Dispose(); // Explicitly cleanup this object, Finalize should run
+ obj = null;
+ Collect();
+ WaitForFinalizers(); // Finalize should NOT run (it was suppressed)
+
+ obj = new DisposeObj("Implicitly disposed");
+ obj = null;
+ Collect();
+ WaitForFinalizers(); // No explicit cleanup, Finalize SHOULD run
+ Display(-1, "Demo stop: Disposing an object versus Finalize.", 0);
+ }
+
+
+ // This method demonstrates the unbalanced nature of ReRegisterForFinalize
+ // and SuppressFinalize. The main point is if your code makes multiple
+ // calls to ReRegisterForFinalize (without intervening calls to
+ // SuppressFinalize) the Finalize method may get called multiple times.
+ private static void FinalizationQDemo() {
+ Display(0, "\n\nDemo start: Suppressing and ReRegistering for Finalize.", +1);
+ // Since this object has a Finalize method, a reference to the object
+ // will be added to the finalization queue.
+ BaseObj obj = new BaseObj("Finalization Queue");
+
+ // Add another 2 references onto the finalization queue
+ // NOTE: Don't do this in a normal app. This is only for demo purposes.
+ GC.ReRegisterForFinalize(obj);
+ GC.ReRegisterForFinalize(obj);
+
+ // There are now 3 references to this object on the finalization queue.
+
+ // Set a bit flag on this object indicating that it should NOT be finalized.
+ GC.SuppressFinalize(obj);
+
+ // There are now 3 references to this object on the finalization queue.
+ // If the object were unreachable, the 1st call to this object's Finalize
+ // method will be discarded but the 2nd & 3rd calls to Finalize will execute.
+
+ // Sets the same bit effectively doing nothing!
+ GC.SuppressFinalize(obj);
+
+ obj = null; // Remove the strong reference to the object.
+
+ // Force a GC so that the object gets finalized
+ Collect();
+ // NOTE: Finalize is called twice because only the 1st call is suppressed!
+ WaitForFinalizers();
+ Display(-1, "Demo stop: Suppressing and ReRegistering for Finalize.", 0);
+ }
+
+
+ // This method demonstrates how objects are promoted between generations.
+ // Applications could take advantage of this info to improve performance
+ // but most applications will ignore this information.
+ private static void GenerationDemo() {
+ Display(0, "\n\nDemo start: Understanding Generations.", +1);
+
+ // Let's see how many generations the managed heap supports (we know it's 2)
+ Display("Maximum GC generations: " + GC.MaxGeneration);
+
+ // Create a new BaseObj in the heap
+ GenObj obj = new GenObj("Generation");
+
+ // Since this object is newly created, it should be in generation 0
+ obj.DisplayGeneration(); // Displays 0
+
+ // Performing a GC promotes the object's generation
+ Collect();
+ obj.DisplayGeneration(); // Displays 1
+
+ Collect();
+ obj.DisplayGeneration(); // Displays 2
+
+ Collect();
+ obj.DisplayGeneration(); // Displays 2 (max generation)
+
+ obj = null; // Destroy the strong reference to this object
+
+ Collect(0); // Collect objects in generation 0
+ WaitForFinalizers(); // We should see nothing
+
+ Collect(1); // Collect objects in generation 1
+ WaitForFinalizers(); // We should see nothing
+
+ Collect(2); // Same as Collect()
+ WaitForFinalizers(); // Now, we should see the Finalize method run
+
+ Display(-1, "Demo stop: Understanding Generations.", 0);
+ }
+
+
+ // This method demonstrates how weak references (WR) work. A WR allows
+ // the GC to collect objects if the managed heap is low on memory.
+ // WRs are useful to apps that have large amounts of easily-reconstructed
+ // data that they want to keep around to improve performance. But, if the
+ // system is low on memory, the objects can be destroyed and replaced when
+ // the app knows that it needs it again.
+ private static void WeakRefDemo(Boolean trackResurrection) {
+ Display(0, String.Format(
+ "\n\nDemo start: WeakReferences that {0}track resurrections.",
+ trackResurrection ? "" : "do not "), +1);
+
+ // Create an object
+ BaseObj obj = new BaseObj("WeakRef");
+
+ // Create a WeakReference object that refers to the new object
+ WeakReference wr = new WeakReference(obj, trackResurrection);
+
+ // The object is still reachable, so it is not finalized.
+ Collect();
+ WaitForFinalizers(); // The Finalize method should NOT execute
+ obj.Display("Still exists");
+
+ // Let's remove the strong reference to the object
+ obj = null; // Destroy strong reference to this object
+
+ // The following line creates a strong reference to the object
+ obj = (BaseObj) wr.Target;
+ Display("Strong reference to object obtained: " + (obj != null));
+
+ obj = null; // Destroy strong reference to this object again.
+
+ // The GC considers the object to be unreachable and collects it.
+ Collect();
+ WaitForFinalizers(); // Finalize should run.
+
+ // This object resurrects itself when its Finalize method is called.
+ // If wr is NOT tracking resurrection, wr thinks the object is dead
+ // If wr is tracking resurrection, wr thinks the object is still alive
+
+ // NOTE: If the object referred to by wr doesn't have a Finalize method,
+ // then wr would think that the object is dead regardless of whether
+ // wr is tracking resurrection or not. For example:
+ // Object obj = new Object(); // Object doesn't have a Finalize method
+ // WeakReference wr = new WeakReference(obj, true);
+ // obj = null;
+ // Collect();
+ // WaitForFinalizers(); // Does nothing
+ // obj = (Object) wr.Target; // returns null
+
+ // The following line attempts to create a strong reference to the object
+ obj = (BaseObj) wr.Target;
+ Display("Strong reference to object obtained: " + (obj != null));
+
+ if (obj != null) {
+ // The strong reference was obtained so this wr must be
+ // tracking resurrection. At this point we have a strong
+ // reference to an object that has been finalized but its memory
+ // has not yet been reclaimed by the collector.
+ obj.Display("See, I'm still alive");
+
+ obj = null; // Destroy the strong reference to the object
+
+ // Collect reclaims the object's memory since this object
+ // has no Finalize method registered for it anymore.
+ Collect();
+ WaitForFinalizers(); // We should see nothing here
+
+ obj = (BaseObj) wr.Target; // This now returns null
+ Display("Strong reference to object obtained: " + (obj != null));
+ }
+
+ // Cleanup everything about this demo so there is no affect on the next demo
+ obj = null; // Destroy strong reference (if it exists)
+ wr = null; // Destroy the WeakReference object (optional)
+ Collect();
+ WaitForFinalizers();
+
+ // NOTE: You are dicouraged from using the WeakReference.IsAlive property
+ // because the object may be killed immediately after IsAlive returns
+ // making the return value incorrect. If the Target property returns
+ // a non-null value, then the object is alive and will stay alive
+ // since you have a reference to it. If Target returns null, then the
+ // object is dead.
+ Display(-1, String.Format("Demo stop: WeakReferences that {0}track resurrections.",
+ trackResurrection ? "" : "do not "), 0);
+ }
+
+
+ public static int Main(String[] args) {
+ // Environment.ExitCode = 1;
+ Display("To fully understand this sample, you should step through the");
+ Display("code in the debugger while monitoring the output generated.\n");
+ Display("NOTE: The demos in this application assume that no garbage");
+ Display(" collections occur naturally. To ensure this, the sample");
+ Display(" objects are small in size and few are allocated.\n");
+ Display("Main thread's hash code: " + Thread.CurrentThread.GetHashCode());
+
+ Introduction(); // GC introduction
+ ResurrectionDemo(); // Demos object resurrection
+ DisposeDemo(); // Demos the use of Dispose & Finalize
+ FinalizationQDemo(); // Demos the use of SuppressFinalize & ReRegisterForFinalize
+ GenerationDemo(); // Demos GC generations
+ WeakRefDemo(false); // Demos WeakReferences without resurrection tracking
+ WeakRefDemo(true); // Demos WeakReferences with resurrection tracking
+
+ // Demos Finalize on Shutdown symantics (this demo is inline)
+ Display(0, "\n\nDemo start: Finalize on shutdown.", +1);
+
+ // Normally, when an application terminates, the GC does NOT collect and run finalizers.
+ // The line below forces the GC to do complete object cleanup
+ // GC.RequestFinalizeOnShutdown(); // For default behavior, comment out this line
+ // NOTE: Once you request FinalizeOnShutdown, you cannot change your mind.
+
+ // When Main returns, obj will have its Finalize method called.
+ BaseObj obj = new BaseObj("Shutdown");
+
+ // This is the last line of code executed before the application terminates.
+ Display(-1, "Demo stop: Finalize on shutdown (application is now terminating)", 0);
+
+ return 100;
+ }
+}
+
+
+///////////////////////////////// End of File /////////////////////////////////
diff --git a/tests/src/GC/Scenarios/Samples/gc.csproj b/tests/src/GC/Scenarios/Samples/gc.csproj
new file mode 100644
index 0000000000..c72b11b7bb
--- /dev/null
+++ b/tests/src/GC/Scenarios/Samples/gc.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="GC.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/ServerModel/app.config b/tests/src/GC/Scenarios/ServerModel/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/ServerModel/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/ServerModel/cache.cs b/tests/src/GC/Scenarios/ServerModel/cache.cs
new file mode 100644
index 0000000000..3ddd5c5f26
--- /dev/null
+++ b/tests/src/GC/Scenarios/ServerModel/cache.cs
@@ -0,0 +1,87 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+namespace ServerSimulator
+{
+ /// <summary>
+ /// This class simulates a cache of user-defined size filled with
+ /// arrays of objects of user-defined size, replacing them using either a FIFO or random algorithm
+ /// </summary>
+ internal sealed class Cache
+ {
+ private Object[] cache_list;
+ private int cache_length;
+ private int cache_item_size;
+ private int cache_item_count;
+ private bool fifo;
+ private int fifoIndex;
+
+ public Cache(bool fifo)
+ {
+ cache_item_size = (int)(ServerSimulator.Params.CacheSize * ServerSimulator.Params.CacheReplacementRate);
+ cache_length = (int)(1 / ServerSimulator.Params.CacheReplacementRate);
+ cache_list = new Object[cache_length];
+ cache_item_count = 0;
+ fifoIndex = 0;
+ this.fifo = fifo;
+ }
+
+ // fills an entry in the cache with an array of objects
+ public void Encache()
+ {
+ Object[] survivors = new Object[1 + cache_item_size / 100];
+
+ int volume = 0;
+ for (int i = 0; volume < cache_item_size; i++)
+ {
+ int alloc_surv = ServerSimulator.Rand.Next(100, 2000 + 2 * i);
+ survivors[i] = new byte[alloc_surv];
+ volume += alloc_surv;
+ }
+
+ int index;
+ if (fifo)
+ {
+ // use fifo cache replacement
+ index = fifoIndex;
+ fifoIndex++;
+ if (fifoIndex == cache_list.Length)
+ {
+ fifoIndex = 0;
+ }
+ }
+ else
+ {
+ // use random cache replacement
+ index = ServerSimulator.Rand.Next(0, cache_length);
+ }
+
+ if (cache_list[index] == null)
+ {
+ cache_item_count++;
+ }
+ cache_list[index] = survivors;
+ }
+
+ // empties the cache
+ public void Clear()
+ {
+ for (int i = 0; i < cache_list.Length; i++)
+ {
+ cache_list[i] = null;
+ }
+ }
+
+ // returns true if the cache is full
+ public bool IsFull
+ {
+ get
+ {
+ return (cache_item_count == cache_length);
+ }
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/ServerModel/parameters.cs b/tests/src/GC/Scenarios/ServerModel/parameters.cs
new file mode 100644
index 0000000000..68f3cd97ff
--- /dev/null
+++ b/tests/src/GC/Scenarios/ServerModel/parameters.cs
@@ -0,0 +1,421 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using ServerSimulator.Properties;
+
+namespace ServerSimulator
+{
+
+ /// <summary>
+ /// This class validates and stores parameters passed in from the command-line or config file
+ /// </summary>
+ internal sealed class Parameters
+ {
+ // the number of requests in flight
+ private int numRequests = 200;
+ public int NumRequests
+ {
+ get { return numRequests; }
+ set
+ {
+ if (value > 0)
+ {
+ numRequests = value;
+ }
+ else
+ {
+ throw new ArgumentOutOfRangeException("value", "NumRequests must be > 0");
+ }
+ }
+ }
+
+ // the fraction of requests that are finalizable
+ private float finalizableRate = 0;
+ public float FinalizableRate
+ {
+ get { return finalizableRate; }
+ set
+ {
+ if ((value >= 0) && (value <= 1))
+ {
+ finalizableRate = value;
+ }
+ else
+ {
+ throw new ArgumentOutOfRangeException("value", "FinalizableRate must be >=0 and <=1");
+ }
+ }
+ }
+
+ // the replacement rate of the cache for each request
+ private float cacheReplacementRate = 0.01f;
+ public float CacheReplacementRate
+ {
+ get { return cacheReplacementRate; }
+ set
+ {
+ if ((value > 0) && (value <= 1))
+ {
+ cacheReplacementRate = value;
+ }
+ else
+ {
+ throw new ArgumentOutOfRangeException("value", "CacheReplacementRate must be >0 and <=1");
+ }
+ }
+ }
+
+ // the fraction that survives for the life of the request
+ private float survivalRate = 0.9f;
+ public float SurvivalRate
+ {
+ get { return survivalRate; }
+ set
+ {
+ if ((value > 0) && (value <= 1))
+ {
+ survivalRate = value;
+ }
+ else
+ {
+ throw new ArgumentOutOfRangeException("value", "SurvivalRate must be >0 and <=1");
+ }
+ }
+ }
+
+ // the number of times to loop (-1 for infinite)
+ private int numPasses = -1;
+ public int NumPasses
+ {
+ get { return numPasses; }
+ set { numPasses = value; }
+ }
+
+ // the random seed for reproducibility
+ private int randomSeed = 0;
+ public int RandomSeed
+ {
+ get { return randomSeed; }
+ set { randomSeed = value; }
+ }
+
+ // the total allocation per request in byte
+ private int allocationVolume = 100000;
+ public int AllocationVolume
+ {
+ get { return allocationVolume; }
+ set
+ {
+ if (value > 0)
+ {
+ allocationVolume = value;
+ }
+ else
+ {
+ throw new ArgumentOutOfRangeException("value", "AllocationVolume must be >0");
+ }
+ }
+ }
+
+ // the cache size in bytes
+ private int cacheSize = 1024*1024*100;
+ public int CacheSize
+ {
+ get { return cacheSize; }
+ set
+ {
+ if (value > 0)
+ {
+ cacheSize = value;
+ }
+ else
+ {
+ throw new ArgumentOutOfRangeException("value", "CacheSize must be > 0");
+ }
+ }
+ }
+
+ // the number of times requests to executes after steady state is achieved.
+ // if it took 300 reqs to achieve steady state, then perform 300*steady_state_factor requests
+ private int steadyStateFactor = 20;
+ public int SteadyStateFactor
+ {
+ get { return steadyStateFactor; }
+ set
+ {
+ if (value > 0)
+ {
+ steadyStateFactor = value;
+ }
+ else
+ {
+ throw new ArgumentOutOfRangeException("value", "SteadyStateFactor must be > 0");
+ }
+ }
+ }
+
+ // the amount of non changing static data in MB
+ private int staticDataVolume = 500;
+ public int StaticDataVolume
+ {
+ get { return staticDataVolume; }
+ set
+ {
+ if (value >= 0)
+ {
+ staticDataVolume = value;
+ }
+ else
+ {
+ throw new ArgumentOutOfRangeException("value", "StaticDataVolume must be >=0");
+ }
+ }
+ }
+
+ // use fifo cache replacement strategy instead of random
+ private bool fifoCache = false;
+ public bool FifoCache
+ {
+ get { return fifoCache; }
+ set { fifoCache = value; }
+ }
+
+ // pin all requests
+ private bool pinning = false;
+ public bool Pinning
+ {
+ get { return pinning; }
+ set { pinning = value; }
+ }
+
+ public Parameters()
+ {
+ numRequests = Settings.Default.NumRequests;
+ finalizableRate = Settings.Default.FinalizableRate;
+ cacheReplacementRate = Settings.Default.CacheReplacementRate;
+ survivalRate = Settings.Default.SurvivalRate;
+ numPasses = Settings.Default.NumPasses;
+ randomSeed = Settings.Default.RandomSeed;
+ allocationVolume = Settings.Default.AllocationVolume;
+ cacheSize = Settings.Default.CacheSize;
+ steadyStateFactor = Settings.Default.SteadyStateFactor;
+ staticDataVolume = Settings.Default.StaticDataVolume;
+ fifoCache = Settings.Default.FifoCache;
+ pinning = Settings.Default.Pinning;
+ }
+
+ // gets and stores command-line parameters
+ public bool GetParams(string[] args)
+ {
+ try
+ {
+ for (int i = 0; i < args.Length; i++)
+ {
+ string str = args[i].ToLower();
+
+ if (str.StartsWith("/randomseed:"))
+ {
+ int randomSeed = 0;
+ if (!Int32.TryParse(str.Substring("/randomseed:".Length), out randomSeed))
+ {
+ Console.WriteLine("Invalid randomseed");
+ return false;
+ }
+ else
+ {
+ //Console.WriteLine("randomseed: {0}", randomSeed);
+ RandomSeed = randomSeed;
+ }
+ }
+ else if (str.StartsWith("/finalizablerate:"))
+ {
+ float finalizableRate = 0;
+ if (!float.TryParse(str.Substring("/finalizablerate:".Length), out finalizableRate))
+ {
+ Console.WriteLine("Invalid finalizablerate");
+ return false;
+ }
+ else
+ {
+ //Console.WriteLine("finalizablerate: {0}", finalizableRate);
+ this.finalizableRate = finalizableRate;
+ }
+ }
+ else if (str.StartsWith("/cachereplacementrate:"))
+ {
+ float cacheReplacementRate = 0;
+ if (!float.TryParse(str.Substring("/cachereplacementrate:".Length), out cacheReplacementRate))
+ {
+ Console.WriteLine("Invalid cachereplacementrate");
+ return false;
+ }
+ else
+ {
+ //Console.WriteLine("cachereplacementrate: {0}", cacheReplacementRate);
+ this.cacheReplacementRate = cacheReplacementRate;
+ }
+ }
+ else if (str.StartsWith("/survivalrate:"))
+ {
+ float survivalRate = 0;
+ if (!float.TryParse(str.Substring("/survivalrate:".Length), out survivalRate))
+ {
+ Console.WriteLine("Invalid survivalrate");
+ return false;
+ }
+ else
+ {
+ //Console.WriteLine("survivalrate: {0}", survivalRate);
+ this.survivalRate = survivalRate;
+ }
+ }
+ else if (str.StartsWith("/numpasses:"))
+ {
+ int numPasses = 0;
+ if (!Int32.TryParse(str.Substring("/numpasses:".Length), out numPasses))
+ {
+ Console.WriteLine("Invalid numpasses");
+ return false;
+ }
+ else
+ {
+ //Console.WriteLine("numpasses: {0}", numPasses);
+ this.numPasses = numPasses;
+ }
+ }
+ else if (str.StartsWith("/allocationvolume:"))
+ {
+ int allocationVolume = 0;
+ if (!Int32.TryParse(str.Substring("/allocationvolume:".Length), out allocationVolume))
+ {
+ Console.WriteLine("Invalid allocationvolume");
+ return false;
+ }
+ else
+ {
+ //Console.WriteLine("allocationvolume: {0}", allocationVolume);
+ this.allocationVolume = allocationVolume;
+ }
+ }
+ else if (str.StartsWith("/cachesize:"))
+ {
+ int cacheSize = 0;
+ if (!Int32.TryParse(str.Substring("/cachesize:".Length), out cacheSize))
+ {
+ Console.WriteLine("Invalid cachesize");
+ return false;
+ }
+ else
+ {
+ //Console.WriteLine("cachesize: {0}", cacheSize);
+ this.cacheSize = cacheSize;
+ }
+ }
+ else if (str.StartsWith("/steadystatefactor:"))
+ {
+ int steadyStateFactor = 0;
+ if (!Int32.TryParse(str.Substring("/steadystatefactor:".Length), out steadyStateFactor))
+ {
+ Console.WriteLine("Invalid steadystatefactor");
+ return false;
+ }
+ else
+ {
+ //Console.WriteLine("steadystatefactor: {0}", steadyStateFactor);
+ this.steadyStateFactor = steadyStateFactor;
+ }
+ }
+ else if (str.StartsWith("/numrequests:"))
+ {
+ int numRequests = 0;
+ if (!Int32.TryParse(str.Substring("/numrequests:".Length), out numRequests))
+ {
+ Console.WriteLine("Invalid numrequests");
+ return false;
+ }
+ else
+ {
+ //Console.WriteLine("numrequests: {0}", numRequests);
+ this.numRequests = numRequests;
+ }
+ }
+ else if (str.StartsWith("/staticdatavolume:"))
+ {
+ int staticDataVolume = 0;
+ if (!Int32.TryParse(str.Substring("/staticdatavolume:".Length), out staticDataVolume))
+ {
+ Console.WriteLine("Invalid staticdatavolume");
+ return false;
+ }
+ else
+ {
+ //Console.WriteLine("staticdatavolume: {0}", staticDataVolume);
+ this.staticDataVolume = staticDataVolume;
+ }
+ }
+ else if (str.StartsWith("/fifocache:"))
+ {
+ int fifoCache = 0;
+ if (!Int32.TryParse(str.Substring("/fifocache:".Length), out fifoCache))
+ {
+ Console.WriteLine("Invalid fifocache");
+ return false;
+ }
+ else
+ {
+ // Console.WriteLine("fifocache: {0}", fifoCache);
+ if (fifoCache == 0)
+ {
+ this.fifoCache = false;
+ }
+ else
+ {
+ this.fifoCache = true;
+ }
+ }
+ }
+ else if (str.StartsWith("/pinning:"))
+ {
+ int pinning = 0;
+ if (!Int32.TryParse(str.Substring("/pinning:".Length), out pinning))
+ {
+ Console.WriteLine("Invalid pinning");
+ return false;
+ }
+ else
+ {
+ //Console.WriteLine("pinning: {0}", pinning);
+ if (pinning == 0)
+ {
+ this.pinning = false;
+ }
+ else
+ {
+ this.pinning = true;
+ }
+ }
+ }
+ else if (str.Equals("/?"))
+ {
+ return false;
+ }
+ else
+ {
+ Console.WriteLine("Invalid parameter");
+ return false;
+ }
+
+ }
+ }
+ catch (ArgumentOutOfRangeException e)
+ {
+ Console.WriteLine(e.Message);
+ return false;
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/ServerModel/request.cs b/tests/src/GC/Scenarios/ServerModel/request.cs
new file mode 100644
index 0000000000..df116cdbe1
--- /dev/null
+++ b/tests/src/GC/Scenarios/ServerModel/request.cs
@@ -0,0 +1,95 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace ServerSimulator
+{
+ /// <summary>
+ /// This class models a typical server request
+ /// </summary>
+ internal class Request
+ {
+ private Object[] survivors;
+ private GCHandle pin;
+
+ public Request()
+ {
+ survivors = new Object[1 + (int)(ServerSimulator.Params.AllocationVolume * ServerSimulator.Params.SurvivalRate) / 100];
+ int index = 0;
+ int volume = 0;
+
+ // allocate half of the request size.
+ while (volume < (int)(ServerSimulator.Params.AllocationVolume / 2))
+ {
+ volume += allocateRequest(index++);
+ }
+
+ // allocate one pinned buffer
+ if (ServerSimulator.Params.Pinning)
+ {
+ pin = GCHandle.Alloc(new byte[100], GCHandleType.Pinned);
+ }
+
+ // allocate the rest of the request
+ while (volume < ServerSimulator.Params.AllocationVolume)
+ {
+ volume += allocateRequest(index++);
+ }
+
+ }
+
+ // allocates the request along with garbage to simulate work on the server side
+ protected int allocateRequest(int index)
+ {
+ int alloc_surv = ServerSimulator.Rand.Next(100, 2000 + 2 * index);
+ int alloc = (int)(alloc_surv / ServerSimulator.Params.SurvivalRate) - alloc_surv;
+
+ // create garbage
+ int j = 0;
+ while (j < alloc)
+ {
+ int s = ServerSimulator.Rand.Next(10, 200 + 2 * j);
+ byte[] garbage = new byte[s];
+ j += s;
+ }
+
+ survivors[index] = new byte[alloc_surv];
+ return alloc_surv + alloc;
+ }
+
+ // deallocates the request
+ public void Retire()
+ {
+ if (pin.IsAllocated)
+ {
+ pin.Free();
+ }
+ }
+
+ }
+
+
+ /// <summary>
+ /// This class is a finalizable version of Request that allocates inside its finalizer
+ /// </summary>
+
+ internal sealed class FinalizableRequest : Request
+ {
+// disabling unused variable warning
+#pragma warning disable 0414
+ private byte[] finalizedData = null;
+#pragma warning restore 0414
+
+ public FinalizableRequest() : base()
+ {
+ }
+
+ ~FinalizableRequest()
+ {
+ finalizedData = new byte[ServerSimulator.Params.AllocationVolume];
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/ServerModel/server.cs b/tests/src/GC/Scenarios/ServerModel/server.cs
new file mode 100644
index 0000000000..fedd5afd03
--- /dev/null
+++ b/tests/src/GC/Scenarios/ServerModel/server.cs
@@ -0,0 +1,109 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+namespace ServerSimulator
+{
+ /// <summary>
+ /// This class simulates the server, which allocates static data for its lifetime,
+ /// fills the cache, creates and retires requests
+ /// </summary>
+ internal sealed class Server
+ {
+ private Object[] static_data;
+
+ public Server()
+ {
+ int volume = 0;
+
+ // static_data size in Mb
+ static_data = new Object[1 + ServerSimulator.Params.StaticDataVolume * 1000];
+
+ for (int i = 0; volume < static_data.Length; i++)
+ {
+ int alloc_surv = ServerSimulator.Rand.Next(1000, 20000 + 2 * i);
+ static_data[i] = new byte[alloc_surv];
+ volume += alloc_surv / 1000;
+ }
+
+ }
+
+ // creates requests until we reach the steady state with a full cache
+ public void OnePass()
+ {
+ int inst_requests = 0;
+ int total_reqs = 0;
+ int nreqs_to_steady = 0;
+ Request[] requests = new Request[ServerSimulator.Params.NumRequests];
+ Cache cache = new Cache(ServerSimulator.Params.FifoCache);
+ int start = Environment.TickCount;
+ int split = start;
+
+ while (true)
+ {
+ total_reqs++;
+
+ int i = ServerSimulator.Rand.Next(0, ServerSimulator.Params.NumRequests);
+ if (requests[i] != null)
+ {
+ requests[i].Retire();
+ }
+ else
+ {
+ inst_requests++;
+ }
+
+ // make every nth request finalizable
+ if (total_reqs % (1 / ServerSimulator.Params.FinalizableRate) == 0)
+ {
+ requests[i] = new FinalizableRequest();
+ }
+ else
+ {
+ requests[i] = new Request();
+ }
+
+ cache.Encache();
+
+ int stop = Environment.TickCount;
+
+ if ((stop - split) > 4000)
+ {
+ Console.WriteLine("{0} reqs/sec", (total_reqs * 1000) / (stop - start));
+ split = stop;
+ }
+
+ if (cache.IsFull && (inst_requests == ServerSimulator.Params.NumRequests))
+ {
+ if (nreqs_to_steady == 0)
+ {
+ nreqs_to_steady = total_reqs;
+ Console.WriteLine("took {0} iteration to reach steady state", nreqs_to_steady);
+ }
+ else if (total_reqs == ServerSimulator.Params.SteadyStateFactor * nreqs_to_steady)
+ {
+ break;
+ }
+ }
+ }
+
+ for (int i = 0; i < requests.Length; i++)
+ {
+ if (requests[i] != null)
+ {
+ requests[i].Retire();
+ }
+ }
+
+ int fstop = Environment.TickCount;
+ Console.WriteLine("{0} reqs/sec", (total_reqs * 1000) / (fstop - start));
+
+ //cleanup
+ static_data = null;
+ cache.Clear();
+
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/ServerModel/servermodel.cs b/tests/src/GC/Scenarios/ServerModel/servermodel.cs
new file mode 100644
index 0000000000..45d8ec4125
--- /dev/null
+++ b/tests/src/GC/Scenarios/ServerModel/servermodel.cs
@@ -0,0 +1,81 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//TBD: memory load (external or in process?)
+// multiple threads
+
+using System;
+
+namespace ServerSimulator
+{
+
+ /// <summary>
+ /// This is modeled after a server executing requests
+ /// which pin some of their newly allocated objects.
+ /// </summary>
+ internal static class ServerSimulator
+ {
+
+ internal static Parameters Params;
+ internal static Random Rand;
+
+ // message displayed to user when passed an incorrect parameter or "/?"
+ public static int Usage()
+ {
+ Console.WriteLine();
+ Console.WriteLine("SERVERSIMULATOR: [/randomseed:int] [/numpasses:int]");
+ Console.WriteLine("\t\t [/cachereplacementrate:float] [/survivalrate:float]");
+ Console.WriteLine("\t\t [/finalizablerate:float] [/allocationvolume:int]");
+ Console.WriteLine("\t\t [/cachesize:int] [/steadystatefactor:int]");
+ Console.WriteLine("\t\t [/numrequests:int] [/staticdatavolume:int]");
+ Console.WriteLine("\t\t [/fifocache:True|False] [/pinning:True|False]");
+ Console.WriteLine();
+ Console.WriteLine("Parameters not passed on the command line are read from the application config file.");
+ return 1;
+ }
+
+ // entrypoint
+ public static int Main(String[] args)
+ {
+ Params = new Parameters();
+
+ if (args.Length > 0)
+ {
+ // check command-line params
+ if (!Params.GetParams(args))
+ {
+ return Usage();
+ }
+ }
+
+ int seed = 0;
+ if (Params.RandomSeed != 0)
+ {
+ // we were passed a random seed
+ seed = Params.RandomSeed;
+ }
+ else
+ {
+ // default to current time
+ seed = (int)DateTime.Now.Ticks;
+ }
+
+ Rand = new Random(seed);
+
+ Console.WriteLine("Using {0} as random seed", seed);
+
+ for (int n = 0; n != Params.NumPasses; n++)
+ {
+ Server server = new Server();
+ server.OnePass();
+ Console.WriteLine("Pass {0} done", n);
+ }
+
+ return 100;
+
+ }
+ }
+
+}
+
diff --git a/tests/src/GC/Scenarios/ServerModel/servermodel.csproj b/tests/src/GC/Scenarios/ServerModel/servermodel.csproj
new file mode 100644
index 0000000000..2df87c311d
--- /dev/null
+++ b/tests/src/GC/Scenarios/ServerModel/servermodel.csproj
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ <CLRTestExecutionArguments>/numrequests:100</CLRTestExecutionArguments>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="Cache.cs" />
+ <Compile Include="Parameters.cs" />
+ <Compile Include="Request.cs" />
+ <Compile Include="Server.cs" />
+ <Compile Include="ServerModel.cs" />
+ <Compile Include="Settings.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/ServerModel/settings.cs b/tests/src/GC/Scenarios/ServerModel/settings.cs
new file mode 100644
index 0000000000..af950bf4ce
--- /dev/null
+++ b/tests/src/GC/Scenarios/ServerModel/settings.cs
@@ -0,0 +1,87 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace ServerSimulator.Properties
+{
+ class Settings {
+
+ public static Settings Default {
+ get {
+ return new Settings();
+ }
+ }
+
+ public int CacheSize {
+ get {
+ return 104857600;
+ }
+ }
+
+ public float CacheReplacementRate {
+ get {
+ return 0.01f;
+ }
+ }
+
+ public int NumRequests {
+ get {
+ return 200;
+ }
+ }
+
+ public int AllocationVolume {
+ get {
+ return 100000;
+ }
+ }
+
+ public float SurvivalRate {
+ get {
+ return 0.9f;
+ }
+ }
+
+ public int StaticDataVolume {
+ get {
+ return 500;
+ }
+ }
+
+ public int SteadyStateFactor {
+ get {
+ return 20;
+ }
+ }
+
+ public int NumPasses {
+ get {
+ return 1;
+ }
+ }
+
+ public bool Pinning {
+ get {
+ return false;
+ }
+ }
+
+ public float FinalizableRate {
+ get {
+ return 0;
+ }
+ }
+
+ public bool FifoCache {
+ get {
+ return false;
+ }
+ }
+
+ public int RandomSeed {
+ get {
+ return 0;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/SingLinkList/app.config b/tests/src/GC/Scenarios/SingLinkList/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/SingLinkList/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/SingLinkList/singlinkgen.cs b/tests/src/GC/Scenarios/SingLinkList/singlinkgen.cs
new file mode 100644
index 0000000000..028a1a34d7
--- /dev/null
+++ b/tests/src/GC/Scenarios/SingLinkList/singlinkgen.cs
@@ -0,0 +1,149 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**************************************************************
+/* a basic test case for GC with cyclic single linked list leaks.
+/* Creat a SingLink object which is a cyclic single linked list
+/* object with iObj number node. then deletes its reference when
+/* the next object is created. Do this loop iRep times.
+/**************************************************************/
+
+
+namespace SingLink {
+ using System;
+
+ public class SingLinkGen
+ {
+// disabling unused variable warning
+#pragma warning disable 0414
+ internal SingLink Mv_Sing;
+#pragma warning restore 0414
+
+ public static int Main(System.String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 100;
+ }
+ break;
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 100;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 10;
+ }
+ break;
+ default:
+ iRep = 100;
+ iObj = 10;
+ break;
+ }
+
+ SingLinkGen Mv_Leak = new SingLinkGen();
+
+ if(Mv_Leak.runTest(iRep, iObj ))
+ {
+ Console.WriteLine( "Test Passed" );
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine( "Test Failed" );
+ return 1;
+ }
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+ int retVal = SetLink(iRep, iObj);
+
+ Console.Write("Times ~LinkNode() was called: ");
+ Console.WriteLine(retVal);
+ return ( retVal == iRep*iObj);
+ }
+
+
+ public int SetLink(int iRep, int iObj)
+ {
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Sing = new SingLink(iObj);
+ //Console.WriteLine("after number {0} singlink is set: {1}", i, GC.GetTotalMemory(false) );
+
+ Mv_Sing = null;
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ }
+ //Console.WriteLine("total allocated memory: {0}", GC.GetTotalMemory(false));
+
+ return LinkNode.FinalCount;
+
+ }
+
+ }
+
+ public class LinkNode
+ {
+ // disabling unused variable warning
+#pragma warning disable 0414
+ internal LinkNode Last;
+ internal int[] Size;
+#pragma warning restore 0414
+
+ public static int FinalCount = 0;
+
+ ~LinkNode()
+ {
+ FinalCount++;
+ }
+
+ public LinkNode(int SizeNum, LinkNode LastObject)
+ {
+ Last = LastObject;
+ Size = new int[SizeNum * 1024];
+ }
+ }
+
+ public class SingLink
+ {
+ internal LinkNode[] Mv_SLink;
+
+ public SingLink(int Num)
+ {
+ Mv_SLink = new LinkNode[Num];
+
+ if (Num == 0)
+ {
+ return;
+ }
+
+ if (Num == 1)
+ {
+ Mv_SLink[0] = new LinkNode(1, Mv_SLink[0]);
+ }
+ else
+ {
+ Mv_SLink[0] = new LinkNode(1, Mv_SLink[Num - 1]);
+ }
+
+ for (int i = 1; i < Num - 1; i++)
+ {
+ Mv_SLink[i] = new LinkNode((i + 1), Mv_SLink[i - 1]);
+ }
+
+ Mv_SLink[Num - 1] = new LinkNode(Num, Mv_SLink[0]);
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/SingLinkList/singlinkgen.csproj b/tests/src/GC/Scenarios/SingLinkList/singlinkgen.csproj
new file mode 100644
index 0000000000..1e5a48f067
--- /dev/null
+++ b/tests/src/GC/Scenarios/SingLinkList/singlinkgen.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="SingLinkGen.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/SingLinkList/singlinkstay.cs b/tests/src/GC/Scenarios/SingLinkList/singlinkstay.cs
new file mode 100644
index 0000000000..e624af97cf
--- /dev/null
+++ b/tests/src/GC/Scenarios/SingLinkList/singlinkstay.cs
@@ -0,0 +1,150 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/******************************************************************
+/*Test case for testing GC with cyclic single linked list leaks
+/*In every loop. SetLink() to create a SingLink object array whose size
+/*is iRep, each SingLink Object is a iObj node cyclic single
+/*linked list. MakeLeak() deletes all the object reference in the array
+/*to make all the cyclic single linked lists become memory leaks.
+/******************************************************************/
+
+namespace SingLink {
+ using System;
+
+ public class SingLinkStay
+ {
+
+ internal SingLink []Mv_Sing;
+
+ public static int Main(System.String [] Args)
+ {
+ int iRep = 0;
+ int iObj = 0;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+ switch( Args.Length )
+ {
+ case 1:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 100;
+ }
+ break;
+ case 2:
+ if (!Int32.TryParse( Args[0], out iRep ))
+ {
+ iRep = 100;
+ }
+ if (!Int32.TryParse( Args[1], out iObj ))
+ {
+ iObj = 10;
+ }
+ break;
+ default:
+ iRep = 100;
+ iObj = 10;
+ break;
+ }
+
+ SingLinkStay Mv_Leak = new SingLinkStay();
+ if(Mv_Leak.runTest(iRep, iObj ))
+ {
+ Console.WriteLine( "Test Passed" );
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine( "Test Failed" );
+ return 1;
+ }
+
+ }
+
+
+ public bool runTest(int iRep, int iObj)
+ {
+ for(int i=0; i<20; i++)
+ {
+ SetLink(iRep, iObj);
+ MakeLeak(iRep);
+ }
+ return true;
+ }
+
+
+ public void SetLink(int iRep, int iObj)
+ {
+
+ Mv_Sing = new SingLink[iRep];
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Sing[i] = new SingLink(iObj);
+ }
+ }
+
+
+ public void MakeLeak(int iRep)
+ {
+ for(int i=0; i<iRep; i++)
+ {
+ Mv_Sing[i] = null;
+ }
+ }
+
+ }
+
+ public class LinkNode
+ {
+ // disabling unused variable warning
+#pragma warning disable 0414
+ internal LinkNode Last;
+ internal int[] Size;
+#pragma warning restore 0414
+
+ public static int FinalCount = 0;
+
+ ~LinkNode()
+ {
+ FinalCount++;
+ }
+
+ public LinkNode(int SizeNum, LinkNode LastObject)
+ {
+ Last = LastObject;
+ Size = new int[SizeNum * 1024];
+ }
+ }
+
+ public class SingLink
+ {
+ internal LinkNode[] Mv_SLink;
+
+ public SingLink(int Num)
+ {
+ Mv_SLink = new LinkNode[Num];
+
+ if (Num == 0)
+ {
+ return;
+ }
+
+ if (Num == 1)
+ {
+ Mv_SLink[0] = new LinkNode(1, Mv_SLink[0]);
+ }
+ else
+ {
+ Mv_SLink[0] = new LinkNode(1, Mv_SLink[Num - 1]);
+ }
+
+ for (int i = 1; i < Num - 1; i++)
+ {
+ Mv_SLink[i] = new LinkNode((i + 1), Mv_SLink[i - 1]);
+ }
+
+ Mv_SLink[Num - 1] = new LinkNode(Num, Mv_SLink[0]);
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/SingLinkList/singlinkstay.csproj b/tests/src/GC/Scenarios/SingLinkList/singlinkstay.csproj
new file mode 100644
index 0000000000..72dd2df13c
--- /dev/null
+++ b/tests/src/GC/Scenarios/SingLinkList/singlinkstay.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="SingLinkStay.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/StringCreator/app.config b/tests/src/GC/Scenarios/StringCreator/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/StringCreator/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/StringCreator/stringcreator.cs b/tests/src/GC/Scenarios/StringCreator/stringcreator.cs
new file mode 100644
index 0000000000..5bc065ecae
--- /dev/null
+++ b/tests/src/GC/Scenarios/StringCreator/stringcreator.cs
@@ -0,0 +1,103 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System;
+
+ public class StringCreator
+ {
+ internal String m_String;
+ internal String[] m_aString, m_aString1;
+ internal const int MAX_LENGTH = 2000;
+
+ public static int Main(String [] Args)
+ {
+ int iNofObjects = 0;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ if (Args.Length==1)
+ {
+ if (!Int32.TryParse( Args[0], out iNofObjects ))
+ {
+ iNofObjects = 2;
+ }
+ }
+ else
+ {
+ iNofObjects = 2;
+ }
+
+
+ RunTest(iNofObjects);
+
+ return 100;
+ }
+
+ public static void RunTest(int iNofObjects)
+ {
+ for (int i = 0; i < iNofObjects; i++)
+ {
+ StringCreator sc = new StringCreator();
+ int slicer = 0;
+ String str;
+ sc.CreateString();
+ do
+ {
+ slicer = sc.SplitString(slicer);
+ str = sc.RotateStrings();
+ } while(String.Compare(String.Empty, "") != 0);
+
+ Console.WriteLine("\nslicer = {0}", slicer);
+ }
+ }
+
+ public void CreateString()
+ {
+ m_String = String.Empty;
+ Console.WriteLine("Creating Strings..");
+ for (int i = 0; i < MAX_LENGTH; i++)
+ {
+ if ( i%100 == 0)
+ {
+ Console.WriteLine("Created Strings: {0} : {1}", i, GC.GetTotalMemory(false));
+ }
+ m_String = m_String + Convert.ToString(i);
+ }
+ }
+
+
+ public int SplitString(int slicer)
+ {
+ char [] Sep = new char[1];
+ Sep[0] = (slicer.ToString())[0];
+ m_aString = m_String.Split(Sep);
+ slicer += 1;
+ if( slicer >= 10 )
+ {
+ slicer -=10;
+ }
+ return slicer;
+ }
+
+
+ public String RotateStrings()
+ {
+ m_String = String.Empty;
+ m_aString1 = new String[m_aString.Length];
+ Console.WriteLine("Creating More Strings..");
+ for (int i = 0; i < m_aString.Length; i++)
+ {
+ if (i%100 == 0)
+ {
+ Console.WriteLine("Created Strings: {0} : {1}", i, GC.GetTotalMemory(false));
+ }
+ m_aString1[i] = (m_aString[(m_aString.Length - 1) - i]);
+ m_String = m_String + m_aString[i];
+ m_aString1[i] = m_aString1[i % m_aString.Length] + m_aString1[i % m_aString.Length];
+ }
+
+ return m_String;
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/StringCreator/stringcreator.csproj b/tests/src/GC/Scenarios/StringCreator/stringcreator.csproj
new file mode 100644
index 0000000000..6c2e49c997
--- /dev/null
+++ b/tests/src/GC/Scenarios/StringCreator/stringcreator.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="StringCreator.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/THDChaos/app.config b/tests/src/GC/Scenarios/THDChaos/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/THDChaos/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/THDChaos/livingobject.cs b/tests/src/GC/Scenarios/THDChaos/livingobject.cs
new file mode 100644
index 0000000000..39338dbfb4
--- /dev/null
+++ b/tests/src/GC/Scenarios/THDChaos/livingobject.cs
@@ -0,0 +1,67 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System.Threading;
+ using System;
+ using System.IO;
+
+ public class LivingObject
+ {
+
+ internal byte [ ]GlobalContainer;
+ internal bool Switch = true;
+ internal static int iCounter = 0;
+
+ public LivingObject( )
+ {
+ Thread Mv_Thread = new Thread( new ThreadStart(this.ThreadStart) );
+ Mv_Thread.Start( );
+ }
+
+
+ public void ThreadStart( )
+ {
+ // console synchronization Console.SetOut(TextWriter.Synchronized(Console.Out));
+
+ if( iCounter%100 == 0)
+ {
+ Console.Out.WriteLine( iCounter + " number of threads has been started" );
+ }
+
+ byte [ ]MethodContainer = new byte[ 1024 ]; // 1K
+
+ if( Switch )
+ {
+ GlobalContainer = new byte[ 1024 ]; // 1K
+ }
+ Switch = !Switch;
+
+ GlobalContainer[ 0 ] = ( byte ) 1;
+ GlobalContainer[ GlobalContainer.Length - 1 ] = ( byte ) 1;
+
+ MethodContainer[ 0 ] = ( byte ) 1;
+ MethodContainer[ MethodContainer.Length - 1 ] = ( byte ) 1;
+
+ IncreatCount( );
+
+ if( LivingObject.iCounter < ThdChaos.iThrd )
+ {
+ Thread Mv_Thread = new Thread( new ThreadStart (this.ThreadStart) );
+ Mv_Thread.Start( );
+ }
+
+ }
+
+
+ public void IncreatCount()
+ {
+ lock(this)
+ {
+ iCounter += 1;
+ }
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/THDChaos/masterthread.cs b/tests/src/GC/Scenarios/THDChaos/masterthread.cs
new file mode 100644
index 0000000000..0486d49475
--- /dev/null
+++ b/tests/src/GC/Scenarios/THDChaos/masterthread.cs
@@ -0,0 +1,44 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System;
+ using System.IO;
+
+ public class MasterThread
+ {
+ internal int iNum = 0;
+
+ public MasterThread( int Children )
+ {
+ // console synchronization Console.SetOut(TextWriter.Synchronized(Console.Out));
+ iNum = Children;
+ runTest();
+ }
+
+ public void runTest()
+ {
+
+ LivingObject [ ]Mv_LivingObject = new LivingObject[ 25 ];
+ int iTotal = Mv_LivingObject.Length;
+ for ( int i = 0; i < iNum; i++ )
+ {
+ for ( int j = 0; j < iTotal; j++ )
+ {
+ Console.Out.WriteLine( "{0} Object Created", j );
+ Console.Out.WriteLine();
+
+ Mv_LivingObject[ j ] = new LivingObject( );
+ }
+
+ Console.Out.WriteLine( "+++++++++++++++++++++++++++++++++++Nest {0} of {1}", i, iNum );
+ Console.Out.WriteLine();
+ }
+
+ Console.Out.WriteLine( "******************************* FinalRest" );
+ }
+
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/THDChaos/thdchaos.cs b/tests/src/GC/Scenarios/THDChaos/thdchaos.cs
new file mode 100644
index 0000000000..ec8d068182
--- /dev/null
+++ b/tests/src/GC/Scenarios/THDChaos/thdchaos.cs
@@ -0,0 +1,44 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+
+//======================================================
+//
+// ThdChaos -- caues multiple asserts
+//
+//======================================================
+
+namespace DefaultNamespace {
+ using System.Threading;
+ using System;
+ using System.IO;
+
+ public class ThdChaos
+ {
+ internal static int iThrd = 0;
+ public static int Main( System.String [] Args )
+ {
+ Console.Out.WriteLine("Test should return with ExitCode 100 ...");
+ // console synchronization Console.SetOut(TextWriter.Synchronized(Console.Out));
+ Console.Out.WriteLine("Args.Length="+Args.Length );
+ if(Args.Length >=1 )
+ {
+ if (!Int32.TryParse( Args[0], out iThrd ))
+ {
+ iThrd = 20;
+ }
+ }
+ else
+ {
+ iThrd = 20;
+ }
+
+ ThdChaos Mv_ThdChaos = new ThdChaos();
+ MasterThread Mv_Thread = new MasterThread( iThrd );
+ return 100;
+
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/THDChaos/thdchaos.csproj b/tests/src/GC/Scenarios/THDChaos/thdchaos.csproj
new file mode 100644
index 0000000000..96de3a3ba8
--- /dev/null
+++ b/tests/src/GC/Scenarios/THDChaos/thdchaos.csproj
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="MasterThread.cs" />
+ <Compile Include="ThdChaos.cs" />
+ <Compile Include="LivingObject.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/THDList/app.config b/tests/src/GC/Scenarios/THDList/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/THDList/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/THDList/linkedlist.cs b/tests/src/GC/Scenarios/THDList/linkedlist.cs
new file mode 100644
index 0000000000..02321faa85
--- /dev/null
+++ b/tests/src/GC/Scenarios/THDList/linkedlist.cs
@@ -0,0 +1,91 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace ThdList {
+ using System.Threading;
+ using System;
+ using System.IO;
+
+ public class Node
+ {
+ internal int m_data;
+ internal Node m_pNext;
+ }
+
+
+ public class LinkedList
+ {
+
+ internal Node m_pHead;
+ internal Random m_Random;
+
+ public LinkedList(int ThreadId)
+ {
+ m_pHead = null;
+ m_Random = new Random();
+ // console synchronization Console.SetOut(TextWriter.Synchronized(Console.Out));
+ }
+
+ public void Empty (int ThreadId)
+ {
+ Console.WriteLine("Thread {0}: List Empty", ThreadId);
+ m_pHead = null;
+ }
+
+ public void AddNodes (int howMany, int ThreadId)
+ {
+ //Adds howMany nodes to the linked list
+ for (int i = 0; i < howMany; i++)
+ {
+ m_pHead = Insert(m_pHead, m_Random.Next(10));
+ }
+ Console.WriteLine("Thread {0} Added {1} Nodes", ThreadId, howMany);
+ }
+
+ public void DeleteNodes (int howMany, int ThreadId)
+ {
+ //Deletes howMany nodes from the linked list
+ for (int i = 0; i < howMany; i++)
+ {
+ m_pHead = Delete(m_pHead, m_Random.Next(10));
+ }
+ Console.WriteLine("Thread {0} Deleted {1} Nodes", ThreadId, howMany);
+ }
+
+ private Node Insert(Node head, int element)
+ {
+
+ if(head == null) //if is NULL make a new node
+ { //and copy number to the new node
+ head=new Node(); //make new node
+ head.m_data = element; //copy number
+ head.m_pNext=null ; //set the next to NULL
+ }
+ else
+ {
+ Node temp;
+ temp = new Node(); //Add the new node as the head
+ temp.m_data = element;
+ temp.m_pNext = head;
+ head = temp;
+ }
+ return head;
+ }
+
+
+ private Node Delete(Node head, int element)
+ {
+ if(head == null)
+ {
+ return head; //Node not found
+ }
+ if (element == head.m_data) //if it was the first data (node)
+ {
+ return head.m_pNext;
+ }
+ head.m_pNext = Delete(head.m_pNext, element); //Recurse to the next element
+ return head; // in the list
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/THDList/llthread.cs b/tests/src/GC/Scenarios/THDList/llthread.cs
new file mode 100644
index 0000000000..426793e733
--- /dev/null
+++ b/tests/src/GC/Scenarios/THDList/llthread.cs
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace ThdList {
+ using System.Threading;
+ using System;
+ using System.IO;
+
+ public class LLThread {
+
+ internal int [] mA_Count = {10000, -5000, -15000, 3000, -6000, 0, 15000, 0, 10000,0,100,100}; //Action Array +ve add, -ve delete, 0 empty
+ internal int m_id = 0;
+ internal LinkedList m_LinkedList;
+ internal Thread Mv_Thread;
+
+ public LLThread(int ThreadId)
+ {
+ // console synchronization Console.SetOut(TextWriter.Synchronized(Console.Out));
+ m_LinkedList = new LinkedList(ThreadId);
+ m_id = ThreadId;
+ Mv_Thread = new Thread( new ThreadStart (this.ThreadStart) );
+ Mv_Thread.Start( );
+ Console.Out.WriteLine("Started Thread: " + m_id);
+ }
+
+ public void ThreadStart()
+ {
+ for (int i = 0; i < mA_Count.Length; i++)
+ {
+ if (mA_Count[i] == 0)
+ {
+ m_LinkedList.Empty(m_id);
+ }
+ else if (mA_Count[i] > 0 )
+ {
+ m_LinkedList.AddNodes(mA_Count[i], m_id);
+ }
+ else
+ {
+ m_LinkedList.DeleteNodes((mA_Count[i] * -1), m_id);
+ }
+ }
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/THDList/thdlist.cs b/tests/src/GC/Scenarios/THDList/thdlist.cs
new file mode 100644
index 0000000000..f97f369718
--- /dev/null
+++ b/tests/src/GC/Scenarios/THDList/thdlist.cs
@@ -0,0 +1,53 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/**
+ * Description:
+ * Mainly stresses the GC by creating n threads each manipulating its own local Linked List.
+ * Each thread in turn adds and deletes thousands of nodes from the linked list.
+ */
+
+
+namespace ThdList {
+ using System.Threading;
+ using System;
+ using System.IO;
+
+ public class ThdList
+ {
+
+ public static int Main (System.String[] Args)
+ {
+
+ Console.Out.WriteLine("Test should return with ExitCode 100 ...");
+ // console synchronization Console.SetOut(TextWriter.Synchronized(Console.Out));
+
+ int iNofThread = 0;
+
+ if (Args.Length == 1)
+ {
+ if (!Int32.TryParse( Args[0], out iNofThread ))
+ {
+ iNofThread = 2;
+ }
+ }
+ else
+ {
+ iNofThread = 2;
+ }
+
+
+ LLThread Mv_LLThread;
+
+ //Creates m_iNofThreads LLThread objects
+ //Each LLThread then launches a thread in its constructor
+ for (int i = 0; i < iNofThread; i++)
+ {
+ Mv_LLThread = new LLThread(i);
+ }
+ return 100;
+ }
+
+ }
+}
diff --git a/tests/src/GC/Scenarios/THDList/thdlist.csproj b/tests/src/GC/Scenarios/THDList/thdlist.csproj
new file mode 100644
index 0000000000..92d87e1c7f
--- /dev/null
+++ b/tests/src/GC/Scenarios/THDList/thdlist.csproj
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="ThdList.cs" />
+ <Compile Include="LLThread.cs" />
+ <Compile Include="LinkedList.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/WeakReference/app.config b/tests/src/GC/Scenarios/WeakReference/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/WeakReference/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/WeakReference/getgencollect.cs b/tests/src/GC/Scenarios/WeakReference/getgencollect.cs
new file mode 100644
index 0000000000..0fd7e24bb7
--- /dev/null
+++ b/tests/src/GC/Scenarios/WeakReference/getgencollect.cs
@@ -0,0 +1,81 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/******************************************************************************/
+/* test: GetGenCollect
+/* Purpose: Test GC.GetGeneration(Object/WeakRefernce) and GC.Collect( Gen )
+/* How: 1.GC.Collect( gen ) should collect the object in "gen" generation.
+/* 2.in Object mv_obj's finalize, the return value of GetGeneration(this)
+/* should be same with GetGeneration(wf);
+/******************************************************************************/
+
+namespace DefaultNamespace {
+ using System;
+
+ internal class GetGenCollect
+ {
+ internal int Gen;
+ internal static WeakReference wf;
+ internal static bool retVal;
+ public static int Main( String [] str )
+ {
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ GetGenCollect mv_obj = new GetGenCollect();
+ wf = new WeakReference( mv_obj, true );
+ mv_obj.MakeGCBusy();
+ mv_obj.Gen = GC.GetGeneration( mv_obj );
+ int g = mv_obj.Gen;
+ mv_obj = null;
+
+ GC.Collect( g );
+ GC.WaitForPendingFinalizers();
+ GC.Collect( g );
+
+ if (retVal)
+ {
+ Console.WriteLine ("Test Passed" );
+ return 100;
+ }
+ Console.WriteLine ("Test Failed" );
+ return 1;
+
+ }
+
+
+ ~GetGenCollect()
+ {
+ Console.WriteLine( "Verified that the object in generation {0} is finalized by calling GC.Collect({0}).",Gen);
+ int g = GC.GetGeneration( this );
+
+ int gwf = GC.GetGeneration( GetGenCollect.wf );
+ Console.WriteLine( "g={0}, gwf={1}", g, gwf );
+
+ if( g != gwf )
+ {
+ Console.WriteLine( "GetGeneration( WeakReferance ) may have problem!" );
+ retVal = false;
+ return;
+ }
+
+ Console.WriteLine( "Passed " );
+ retVal = true;
+
+ }
+
+ public void MakeGCBusy()
+ {
+ Object [] vary = new Object[2];
+ for( int i=0; i< 1000; i++ )
+ {
+ vary[0] = (new int[i]);
+ vary[1] = ( vary[0] );
+ if( i%20 == 0 )
+ {
+ GC.Collect();
+ }
+ }
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/WeakReference/getgencollect.csproj b/tests/src/GC/Scenarios/WeakReference/getgencollect.csproj
new file mode 100644
index 0000000000..8bf2b814bc
--- /dev/null
+++ b/tests/src/GC/Scenarios/WeakReference/getgencollect.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="GetGenCollect.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/WeakReference/weakref.cs b/tests/src/GC/Scenarios/WeakReference/weakref.cs
new file mode 100644
index 0000000000..db1e9b846b
--- /dev/null
+++ b/tests/src/GC/Scenarios/WeakReference/weakref.cs
@@ -0,0 +1,165 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System;
+ using System.Collections.Generic;
+
+ internal class CreateObj
+ {
+ private String [] Str;
+ private List<WeakReference> alWeakRef;
+
+ public CreateObj(int iObj,int iSwitch)
+ {
+ Str = new String[iObj];
+ alWeakRef = new List<WeakReference>();
+ }
+
+ public bool RunTest(int iObj,int iSwitch)
+ {
+ if (!DeleteObj(iObj,iSwitch))
+ {
+ return false;
+ }
+ return CheckResult(iObj);
+ }
+
+ public bool DeleteObj(int iObj,int iSwitch)
+ {
+ for( int i= 0; i< iObj; i++ )
+ {
+ Str[i] = ( i.ToString() );
+ alWeakRef.Add( new WeakReference( Str[i], iSwitch==1) );
+ }
+
+ GC.Collect();
+
+ for( int i=0; i< iObj; i++)
+ {
+ if ( alWeakRef[i].Target == null )
+ {
+ //*all weakref have strong reference, so it should not return null
+ return false;
+ }
+ }
+
+ for( int i=0; i< iObj; i++)
+ {
+ Str[i] = null;
+ }
+ GC.Collect();
+
+ return true;
+
+ }
+
+ public bool CheckResult(int iObj)
+ {
+ for( int i=0; i< iObj; i++)
+ {
+ if ( alWeakRef[ i ].Target != null )
+ {
+ //*no weakref have strong reference, so it should return null
+ return false;
+ }
+ }
+ return true;
+ }
+
+ }
+
+
+ internal class CreateObj2
+ {
+ public WeakRef mv_Obj;
+
+ public CreateObj2()
+ {
+ mv_Obj = new WeakRef();
+ }
+
+ public bool RunTest(int iObj,int iSwitch)
+ {
+ return ( mv_Obj.RealWeakRef( iObj, iSwitch ));
+ }
+ }
+
+
+ internal class WeakRef
+ {
+
+ public bool RealWeakRef(int iObj, int iSwitch)
+ {
+
+ CreateObj temp = new CreateObj(iObj,iSwitch);
+ bool result = temp.RunTest(iObj,iSwitch);
+ return result;
+ }
+ }
+
+
+ internal class Test
+ {
+ public static int Main(String [] Args)
+ {
+ int iObj = 0;
+ int iSwitch = 0;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ if (Args.Length >=2)
+ {
+ if (!Int32.TryParse( Args[0], out iObj ))
+ {
+ iObj = 10;
+ }
+ if (!Int32.TryParse( Args[1], out iSwitch ))
+ {
+ iSwitch = 1;
+ }
+ }
+ else
+ {
+ iObj = 10;
+ iSwitch = 1;
+ }
+
+
+ CreateObj2 temp = new CreateObj2();
+ if (temp.RunTest(iObj,iSwitch))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+
+ }
+
+ internal class BNode
+ {
+ public static int icCreateNode = 0;
+ public static int icFinalNode = 0;
+ internal int [] mem;
+ internal List<BNode> ResObj = new List<BNode>();
+ public BNode( int i )
+ {
+ icCreateNode++;
+ mem = new int[i];
+ mem[0] = 0;
+ if(i > 1 )
+ {
+ mem[mem.Length-1] = mem.Length-1;
+ }
+ }
+
+ ~BNode()
+ {
+ icFinalNode++;
+ ResObj.Add( this );
+ }
+ }
+}
diff --git a/tests/src/GC/Scenarios/WeakReference/weakref.csproj b/tests/src/GC/Scenarios/WeakReference/weakref.csproj
new file mode 100644
index 0000000000..b93fb3ce48
--- /dev/null
+++ b/tests/src/GC/Scenarios/WeakReference/weakref.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="WeakRef.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/WeakReference/weakreffinal.cs b/tests/src/GC/Scenarios/WeakReference/weakreffinal.cs
new file mode 100644
index 0000000000..a356cec433
--- /dev/null
+++ b/tests/src/GC/Scenarios/WeakReference/weakreffinal.cs
@@ -0,0 +1,182 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+ using System;
+ using System.Collections.Generic;
+
+ internal class CreateObj
+ {
+ public BNode []rgNode;
+ public List<WeakReference> alWeakRef;
+ public bool bret;
+
+ public CreateObj(int iObj)
+ {
+ rgNode = new BNode[iObj];
+ alWeakRef = new List<WeakReference>();
+ bret = true;
+ }
+
+ public bool RunTest(int iObj,int iSwitch)
+ {
+ DeleteObj(iObj,iSwitch);
+ bool result = CheckResult(iObj,iSwitch);
+ return result;
+ }
+
+ public void DeleteObj(int iObj,int iSwitch)
+ {
+ for( int i= 0; i< iObj; i++ )
+ {
+ rgNode[i] = new BNode( i+1 );
+ alWeakRef.Add( new WeakReference( rgNode[i], (iSwitch == 1) ) );
+ }
+
+ GC.Collect();
+ for( int i=0; i< iObj; i++)
+ {
+ if ( (alWeakRef[ i ]).Target == null )
+ {
+ //*all weakref have strong reference, so it should not return null
+ bret = false;
+ }
+ }
+
+ for( int i=0; i< iObj; i++)
+ {
+ rgNode[i] = null;
+ }
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ }
+
+ public bool CheckResult(int iObj,int iSwitch)
+ {
+ for( int i=0; i< iObj; i++)
+ {
+ if(iSwitch == 1)
+ {
+ if ( (alWeakRef[ i ]).Target == null )
+ {
+ //*weakrefs have strong reference, so it should not return null
+ bret = false;
+ }
+ }
+ else
+ {
+ if ( (alWeakRef[ i ]).Target != null )
+ {
+ //*no weakref have strong reference, so it should return null
+ bret = false;
+ }
+ }
+ }
+ for(int i=0; i< iObj; i++ )
+ {
+ rgNode[i] = (BNode)BNode.ResObj[ i ];
+ }
+ return bret;
+ }
+
+ }
+
+ internal class WeakRefFinal
+ {
+
+ public bool RealWeakRef(int iObj, int iSwitch)
+ {
+ CreateObj temp = new CreateObj(iObj);
+ bool result = temp.RunTest(iObj,iSwitch);
+ return result;
+ }
+ }
+
+
+ internal class BNode
+ {
+ public static int icCreateNode = 0;
+ public static int icFinalNode = 0;
+ internal int [] mem;
+ public static List<BNode> ResObj = new List<BNode>();
+ public BNode( int i )
+ {
+ icCreateNode++;
+ mem = new int[i];
+ mem[0] = 0;
+ if(i > 1 )
+ {
+ mem[mem.Length-1] = mem.Length-1;
+ }
+
+ }
+
+ ~BNode()
+ {
+ icFinalNode++;
+ ResObj.Add( this );
+ }
+ }
+
+ internal class CreateObj2
+ {
+ public WeakRefFinal mv_Obj;
+
+ public CreateObj2()
+ {
+ mv_Obj = new WeakRefFinal();
+ }
+
+ public bool RunTest(int iObj,int iSwitch)
+ {
+ return ( mv_Obj.RealWeakRef( iObj, iSwitch ));
+ }
+
+ }
+
+ internal class Test
+ {
+ public static int Main(String [] Args)
+ {
+ int iObj = 0;
+ int iSwitch = 0;
+
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ if (Args.Length >=2)
+ {
+ if (!Int32.TryParse( Args[0], out iObj ))
+ {
+ iObj = 10;
+ }
+ if (!Int32.TryParse( Args[1], out iSwitch ))
+ {
+ iSwitch = 1;
+ }
+ }
+ else
+ {
+ iObj = 10;
+ iSwitch = 1;
+ }
+
+ CreateObj2 temp = new CreateObj2();
+ if (temp.RunTest(iObj,iSwitch))
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ Console.WriteLine("Test Failed");
+ return 1;
+
+
+
+ }
+
+ }
+
+}
diff --git a/tests/src/GC/Scenarios/WeakReference/weakreffinal.csproj b/tests/src/GC/Scenarios/WeakReference/weakreffinal.csproj
new file mode 100644
index 0000000000..6fca7a9b16
--- /dev/null
+++ b/tests/src/GC/Scenarios/WeakReference/weakreffinal.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="WeakRefFinal.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Scenarios/muldimjagary/app.config b/tests/src/GC/Scenarios/muldimjagary/app.config
new file mode 100644
index 0000000000..c51f616257
--- /dev/null
+++ b/tests/src/GC/Scenarios/muldimjagary/app.config
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration>
diff --git a/tests/src/GC/Scenarios/muldimjagary/muldimjagary.cs b/tests/src/GC/Scenarios/muldimjagary/muldimjagary.cs
new file mode 100644
index 0000000000..eddea85446
--- /dev/null
+++ b/tests/src/GC/Scenarios/muldimjagary/muldimjagary.cs
@@ -0,0 +1,181 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace DefaultNamespace {
+using System;
+
+/*************************************************************/
+/* test: MulDimJagAry.cs
+/* Purpose: Test GC with Multiple dimentions array
+/* Coverage: int[][], Object[][], Object[][][], Variant[][][],
+/* take Mul_Dimention array as function argument.
+/*************************************************************/
+
+
+ class MulDimJagAry
+ {
+ public static int Main(String []args)
+ {
+ int iDim1 = 100;
+ int iDim2 = 100;
+ int iRep = 30;
+ Console.WriteLine("Test should return with ExitCode 100 ...");
+
+ MulDimJagAry mv_Obj = new MulDimJagAry();
+
+ int [][] iJag;
+ for(int j=0; j<iRep; j++ )
+ {
+ iJag = new int[iDim1][];
+ for( int i=0; i< iDim2; i++ )
+ {
+ iJag[i] = new int[i];
+ if( i>= 1 )
+ {
+ iJag[i][0] = 0;
+ iJag[i][i-1] = i;
+ }
+ }
+ //if( GC.GetTotalMemory(false) >= 1024*1024*6 )
+ //{
+ // Console.WriteLine( "HeapSize before GC: "+ GC.GetTotalMemory(false) );
+ // GC.Collect();
+ // Console.WriteLine( "HeapSize after GC: "+ GC.GetTotalMemory(false) );
+ //}
+ }
+
+ Object[][] oJag;
+ for(int j=0; j<iRep; j++ )
+ {
+ oJag = new Object[iDim1][];
+ for( int i=0; i< iDim1; i++ )
+ {
+ oJag[i] = new Object[i];
+ if( i>= 1 )
+ {
+ oJag[i][0] = (0);
+ oJag[i][i-1] = new long[i];
+ }
+
+ }
+ //if( GC.GetTotalMemory(false) >= 1024*1024*6 )
+ //{
+ // Console.WriteLine( "HeapSize before GC: "+ GC.GetTotalMemory(false) );
+ // GC.Collect();
+ // Console.WriteLine( "HeapSize after GC: "+ GC.GetTotalMemory(false) );
+ //}
+ }
+
+ Object[][][] oJag3 = new Object[iDim1][][];
+ oJag3[3] = new Object[iDim2][];
+ oJag3[4] = new Object[iDim2][];
+ for (int i = 0; i < iDim2; i ++)
+ {
+ oJag3[4][i] = new Object[iDim1];
+ }
+
+ for(int j=0; j<iRep; j++ )
+ {
+ oJag3 = new Object[iDim1][][];
+ for( int i=0; i< iDim1; i++ )
+ {
+ oJag3[i] = new Object[iDim2][];
+ for(int k=0; k<iDim2; k++)
+ {
+ oJag3[i][k] = new Object[k];
+ for(int l = 0; l< k; l++ )
+ {
+ if( l>= 1 )
+ {
+ oJag3[i][k][0] = (0);
+ oJag3[i][k][l-1] = new long[l];
+ }
+ }
+ }
+
+ }
+ //if( GC.GetTotalMemory(false) >= 1024*1024*6 )
+ //{
+ // Console.WriteLine( "HeapSize before GC: "+ GC.GetTotalMemory(false) );
+ // GC.Collect();
+ // Console.WriteLine( "HeapSize after GC: "+ GC.GetTotalMemory(false) );
+ //}
+ }
+
+ for(int j=0; j<iRep; j++ )
+ {
+ oJag3 = new Object[iDim1][][];
+ mv_Obj.SetThreeDimJagAry( oJag3, iDim1, iDim2 );
+ //if( GC.GetTotalMemory(false) >= 1024*1024*6 )
+ //{
+ // Console.WriteLine( "HeapSize before GC: "+ GC.GetTotalMemory(false) );
+ // GC.Collect();
+ // Console.WriteLine( "HeapSize after GC: "+ GC.GetTotalMemory(false) );
+ //}
+ }
+
+
+ Object[][][] vJag;
+ for(int j=0; j<iRep; j++ )
+ {
+ vJag = new Object[iDim1][][];
+ mv_Obj.SetThreeDimJagVarAry( vJag, iDim1, iDim2 );
+ //if( GC.GetTotalMemory(false) >= 1024*1024*6 )
+ //{
+ // Console.WriteLine( "HeapSize before GC: "+ GC.GetTotalMemory(false) );
+ // GC.Collect();
+ // Console.WriteLine( "HeapSize after GC: "+ GC.GetTotalMemory(false) );
+ //}
+ }
+
+
+ return 100;
+
+ }
+
+ public void SetThreeDimJagAry( Object [][][] oJag, int iDim1, int iDim2 )
+ {
+ for( int i=0; i< iDim1; i++ )
+ {
+ oJag[i] = new Object[iDim2][];
+ for(int k=0; k<iDim2; k++)
+ {
+ oJag[i][k] = new Object[k];
+ for(int l = 0; l< k; l++ )
+ {
+ if( l>= 1 )
+ {
+ oJag[i][k][0] = (0);
+ oJag[i][k][l-1] = new float[l];
+
+ }
+ }
+
+ }
+ }
+ }
+
+ public void SetThreeDimJagVarAry( Object [][][] vJag, int iDim1, int iDim2 )
+ {
+ for( int i=0; i< iDim1; i++ )
+ {
+ vJag[i] = new Object[iDim2][];
+ for(int k=0; k<iDim2; k++)
+ {
+ vJag[i][k] = new Object[k];
+ for(int l = 0; l< k; l++ )
+ {
+ if( l>= 1 )
+ {
+ vJag[i][k][0] = (0);
+ vJag[i][k][l-1] = ( new double[l] );
+ }
+ }
+
+ }
+ }
+ }
+ }
+
+}
diff --git a/tests/src/GC/Scenarios/muldimjagary/muldimjagary.csproj b/tests/src/GC/Scenarios/muldimjagary/muldimjagary.csproj
new file mode 100644
index 0000000000..ecb0bea297
--- /dev/null
+++ b/tests/src/GC/Scenarios/muldimjagary/muldimjagary.csproj
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <ItemGroup>
+ <!-- Add Compile Object Here -->
+ <Compile Include="MulDimJagAry.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ <None Include="$(GCPackagesConfigFileDirectory)extra\project.json" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(GCPackagesConfigFileDirectory)extra\project.json</ProjectJson>
+ <ProjectLockJson>$(GCPackagesConfigFileDirectory)extra\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/src/GC/Coverage/project.json b/tests/src/GC/config/extra/project.json
index 14c11d232b..c83488e51f 100644
--- a/tests/src/GC/Coverage/project.json
+++ b/tests/src/GC/config/extra/project.json
@@ -26,9 +26,10 @@
"System.Xml.ReaderWriter": "4.0.11-beta-23302",
"System.Xml.XDocument": "4.0.11-beta-23302",
"System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
+ "System.Xml.XmlSerializer": "4.0.11-beta-23302",
+ "System.Threading.Thread": "4.0.0-beta-23302"
},
"frameworks": {
"dnxcore50": {}
}
-}
+} \ No newline at end of file
diff --git a/tests/src/GC/API/GCSettings/project.json b/tests/src/GC/config/minimal/project.json
index 14c11d232b..89527b786c 100644
--- a/tests/src/GC/API/GCSettings/project.json
+++ b/tests/src/GC/config/minimal/project.json
@@ -26,9 +26,9 @@
"System.Xml.ReaderWriter": "4.0.11-beta-23302",
"System.Xml.XDocument": "4.0.11-beta-23302",
"System.Xml.XmlDocument": "4.0.1-beta-23302",
- "System.Xml.XmlSerializer": "4.0.11-beta-23302"
+ "System.Xml.XmlSerializer": "4.0.11-beta-23302",
},
"frameworks": {
"dnxcore50": {}
}
-}
+} \ No newline at end of file
diff --git a/tests/src/GC/dir.props b/tests/src/GC/dir.props
new file mode 100644
index 0000000000..4e8400f747
--- /dev/null
+++ b/tests/src/GC/dir.props
@@ -0,0 +1,7 @@
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="..\dir.props" />
+
+ <PropertyGroup>
+ <GCPackagesConfigFileDirectory>$(MSBuildThisFileDirectory)config\</GCPackagesConfigFileDirectory>
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/tests/testsFailingOutsideWindows.txt b/tests/testsFailingOutsideWindows.txt
index 02ec872aea..b711a2af04 100644
--- a/tests/testsFailingOutsideWindows.txt
+++ b/tests/testsFailingOutsideWindows.txt
@@ -175,4 +175,37 @@ JIT/Regression/Dev11/External/dev11_145295/CSharpPart/CSharpPart.sh
Interop/ArrayMarshalling/ByValArray/MarshalArrayByValTest/MarshalArrayByValTest.sh
Interop/StringMarshalling/LPSTR/LPSTRTest/LPSTRTest.sh
Interop/StringMarshalling/LPTSTR/LPTSTRTest/LPTSTRTest.sh
-
+GC/API/WeakReference/Finalize2/Finalize2.sh
+GC/API/WeakReference/NullHandle/NullHandle.sh
+GC/API/WeakReference/Target/Target.sh
+GC/API/WeakReference/IsAlive/IsAlive.sh
+GC/API/WeakReference/IsAlive_neg/IsAlive_neg.sh
+GC/Features/Finalizer/finalizeother/finalizedirectedgraph/finalizedirectedgraph.sh
+GC/LargeMemory/Allocation/finalizertest/finalizertest.sh
+GC/LargeMemory/API/gc/reregisterforfinalize/reregisterforfinalize.sh
+GC/LargeMemory/API/gc/collect/collect.sh
+GC/Scenarios/DoublinkList/doublinknoleak2/doublinknoleak2.sh
+GC/Scenarios/DoublinkList/doublinknoleak/doublinknoleak.sh
+GC/Scenarios/LeakWheel/leakwheel/leakwheel.sh
+GC/Scenarios/SingLinkList/singlinkgen/singlinkgen.sh
+GC/Scenarios/WeakReference/getgencollect/getgencollect.sh
+GC/Scenarios/WeakReference/weakref/weakref.sh
+GC/LargeMemory/API/gc/getgeneration/getgeneration.sh
+GC/Scenarios/BaseFinal/basefinal/basefinal.sh
+GC/Coverage/concurrentspin2/concurrentspin2.sh
+GC/Coverage/smalloom/smalloom.sh
+GC/Coverage/271010/271010.sh
+GC/Features/BackgroundGC/concurrentspin2/concurrentspin2.sh
+GC/Features/BackgroundGC/foregroundgc/foregroundgc.sh
+GC/Features/LOHCompaction/lohcompact_stress/lohcompact_stress.sh
+GC/Features/LOHCompaction/lohcompactscenariorepro/lohcompactscenariorepro.sh
+GC/Features/LOHCompaction/lohcompactapi2/lohcompactapi2.sh
+GC/Features/LOHFragmentation/lohfragmentation/lohfragmentation.sh
+GC/Features/PartialCompaction/partialcompactiontest/partialcompactiontest.sh
+GC/Features/PartialCompaction/partialcompactionwloh/partialcompactionwloh.sh
+GC/Features/PartialCompaction/eco1/eco1.sh
+GC/Features/SustainedLowLatency/sustainedlowlatency_race_reverse/sustainedlowlatency_race_reverse.sh
+GC/Features/SustainedLowLatency/scenario/scenario.sh
+GC/Features/SustainedLowLatency/sustainedlowlatency_race/sustainedlowlatency_race.sh
+GC/Regressions/dev10bugs/536168/536168/536168.sh
+GC/M10/RefCrossTHDs/refcrossthds/refcrossthds.sh
diff --git a/tests/testsUnsupportedOutsideWindows.txt b/tests/testsUnsupportedOutsideWindows.txt
index 077ed19817..3831f860c2 100644
--- a/tests/testsUnsupportedOutsideWindows.txt
+++ b/tests/testsUnsupportedOutsideWindows.txt
@@ -191,3 +191,4 @@ JIT/opt/Inline/tests/xmodb/xmodb.sh
JIT/Regression/CLR-x86-JIT/V1-M12-Beta2/b79250/b79250/b79250.sh
managed/Compilation/Compilation/Compilation.sh
Regressions/coreclr/0584/Test584/Test584.sh
+GC/Regressions/v2.0-beta2/437657/437657/437657.sh
diff --git a/tests/x86_legacy_backend_issues.targets b/tests/x86_legacy_backend_issues.targets
index cde4dc8475..66c083a734 100644
--- a/tests/x86_legacy_backend_issues.targets
+++ b/tests/x86_legacy_backend_issues.targets
@@ -495,5 +495,125 @@
<ExcludeList Include="$(XunitTestBinBase)\Interop\StringMarshalling\LPTSTR\LPTSTRTest\LPTSTRTest.cmd">
<Issue>needs triage</Issue>
</ExcludeList>
- </ItemGroup>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\API\WeakReference\Finalize2\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\API\WeakReference\NullHandle\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\API\WeakReference\Target\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\API\WeakReference\IsAlive\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\API\WeakReference\IsAlive_neg\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\Finalizer\finalizeother\finalizedirectedgraph\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\Allocation\finalizertest\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\Allocation\largeexceptiontest\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\API\gc\reregisterforfinalize\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\API\gc\collect\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\API\gc\suppressfinalize\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\API\gc\getgeneration\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\Regressions\largearraytest\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\API\gc\keepalive\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\LargeMemory\API\gc\gettotalmemory\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\DoublinkList\doublinknoleak2\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\ReflectObj\reflectobj\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\DoublinkList\doublinknoleak\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\LeakWheel\leakwheel\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\SingLinkList\singlinkgen\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\WeakReference\getgencollect\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\WeakReference\weakref\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\BaseFinal\basefinal\*">
+ <Issue>3391</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Coverage\concurrentspin2\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Coverage\smalloom\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Coverage\271010\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\BackgroundGC\concurrentspin2\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\BackgroundGC\foregroundgc\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\LOHCompaction\lohcompact_stress\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\LOHCompaction\lohcompactscenariorepro\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\LOHCompaction\lohcompactapi2\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\LOHFragmentation\lohfragmentation\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\PartialCompaction\partialcompactiontest\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\PartialCompaction\partialcompactionwloh\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\PartialCompaction\eco1\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\SustainedLowLatency\sustainedlowlatency_race_reverse\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\SustainedLowLatency\scenario\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Features\SustainedLowLatency\sustainedlowlatency_race\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Regressions\dev10bugs\536168\536168\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ <ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\muldimjagary\muldimjagary\*">
+ <Issue>3392</Issue>
+ </ExcludeList>
+ </ItemGroup>
</Project>