11using NUnit . Framework ;
22using Python . Runtime ;
33using System ;
4+ using System . Linq ;
45using System . Threading ;
56
67namespace Python . EmbeddingTest
78{
89 public class TestFinalizer
910 {
1011 private string _PYTHONMALLOC = string . Empty ;
12+ private int _oldThreshold ;
1113
1214 [ SetUp ]
1315 public void SetUp ( )
@@ -21,13 +23,15 @@ public void SetUp()
2123 _PYTHONMALLOC = string . Empty ;
2224 }
2325 Environment . SetEnvironmentVariable ( "PYTHONMALLOC" , "malloc" ) ;
26+ _oldThreshold = Finalizer . Instance . Threshold ;
2427 PythonEngine . Initialize ( ) ;
2528 Exceptions . Clear ( ) ;
2629 }
2730
2831 [ TearDown ]
2932 public void TearDown ( )
3033 {
34+ Finalizer . Instance . Threshold = _oldThreshold ;
3135 PythonEngine . Shutdown ( ) ;
3236 if ( string . IsNullOrEmpty ( _PYTHONMALLOC ) )
3337 {
@@ -56,41 +60,42 @@ public void CollectBasicObject()
5660 Assert . GreaterOrEqual ( e . ObjectCount , 1 ) ;
5761 called = true ;
5862 } ;
59- Finalizer . Instance . CollectOnce += handler ;
60- try
61- {
62- FullGCCollect ( ) ;
63- PyLong obj = new PyLong ( 1024 ) ;
6463
65- WeakReference shortWeak = new WeakReference ( obj ) ;
66- WeakReference longWeak = new WeakReference ( obj , true ) ;
67- obj = null ;
68- FullGCCollect ( ) ;
69- // The object has been resurrected
70- // FIXME: Sometimes the shortWeak would get alive
71- //Assert.IsFalse(shortWeak.IsAlive);
72- Assert . IsTrue ( longWeak . IsAlive ) ;
64+ WeakReference shortWeak ;
65+ WeakReference longWeak ;
66+ {
67+ MakeAGarbage ( out shortWeak , out longWeak ) ;
68+ }
69+ FullGCCollect ( ) ;
70+ // The object has been resurrected
71+ Assert . IsFalse ( shortWeak . IsAlive ) ;
72+ Assert . IsTrue ( longWeak . IsAlive ) ;
7373
74- Assert . IsFalse ( called ) ;
74+ {
7575 var garbage = Finalizer . Instance . GetCollectedObjects ( ) ;
7676 Assert . NotZero ( garbage . Count ) ;
77- // FIXME: If make some query for garbage,
78- // the above case will failed Assert.IsFalse(shortWeak.IsAlive)
79- //Assert.IsTrue(garbage.All(T => T.IsAlive));
77+ Assert . IsTrue ( garbage . Any ( T => ReferenceEquals ( T . Target , longWeak . Target ) ) ) ;
78+ }
8079
80+ Assert . IsFalse ( called ) ;
81+ Finalizer . Instance . CollectOnce += handler ;
82+ try
83+ {
8184 Finalizer . Instance . CallPendingFinalizers ( ) ;
82- Assert . IsTrue ( called ) ;
83-
84- FullGCCollect ( ) ;
85- //Assert.IsFalse(garbage.All(T => T.IsAlive));
86-
87- Assert . IsNull ( longWeak . Target ) ;
8885 }
8986 finally
9087 {
9188 Finalizer . Instance . CollectOnce -= handler ;
9289 }
90+ Assert . IsTrue ( called ) ;
91+ }
9392
93+ private static void MakeAGarbage ( out WeakReference shortWeak , out WeakReference longWeak )
94+ {
95+ PyLong obj = new PyLong ( 1024 ) ;
96+ shortWeak = new WeakReference ( obj ) ;
97+ longWeak = new WeakReference ( obj , true ) ;
98+ obj = null ;
9499 }
95100
96101 private static long CompareWithFinalizerOn ( PyObject pyCollect , bool enbale )
@@ -101,7 +106,7 @@ private static long CompareWithFinalizerOn(PyObject pyCollect, bool enbale)
101106 FullGCCollect ( ) ;
102107 FullGCCollect ( ) ;
103108 pyCollect . Invoke ( ) ;
104- Finalizer . Instance . CallPendingFinalizers ( ) ;
109+ Finalizer . Instance . Collect ( ) ;
105110 Finalizer . Instance . Enable = enbale ;
106111
107112 // Estimate unmanaged memory size
@@ -116,7 +121,7 @@ private static long CompareWithFinalizerOn(PyObject pyCollect, bool enbale)
116121 pyCollect . Invoke ( ) ;
117122 if ( enbale )
118123 {
119- Finalizer . Instance . CallPendingFinalizers ( ) ;
124+ Finalizer . Instance . Collect ( ) ;
120125 }
121126
122127 FullGCCollect ( ) ;
0 commit comments