xref: /petsc/src/binding/petsc4py/test/test_gc.py (revision 8577b683712d1cca1e9b8fdaa9ae028364224dad)
15808f684SSatish Balayfrom petsc4py import PETSc
2*6eca135dSLisandro Dalcinimport os
35808f684SSatish Balayimport unittest
46f336411SStefano Zampiniimport gc
56f336411SStefano Zampiniimport weakref
65808f684SSatish Balay
75808f684SSatish Balay# --------------------------------------------------------------------
85808f684SSatish Balay
95808f684SSatish Balay## gc.set_debug((gc.DEBUG_STATS |
105808f684SSatish Balay##               gc.DEBUG_LEAK) &
115808f684SSatish Balay##              ~gc.DEBUG_SAVEALL)
125808f684SSatish Balay
135808f684SSatish Balay# --------------------------------------------------------------------
145808f684SSatish Balay
15*6eca135dSLisandro DalcinPYSABI = os.path.basename(PETSc.__file__).split(".")[1] == "abi3"
16*6eca135dSLisandro Dalcin
175808f684SSatish Balay
186f336411SStefano Zampiniclass BaseTestGC:
195808f684SSatish Balay    def setUp(self):
205808f684SSatish Balay        self.obj = self.CLASS().create(comm=PETSc.COMM_SELF)
215808f684SSatish Balay
225808f684SSatish Balay    def tearDown(self):
235808f684SSatish Balay        wref = self.make_weakref()
245808f684SSatish Balay        self.assertTrue(wref() is self.obj)
255808f684SSatish Balay        self.obj = None
265808f684SSatish Balay        gc.collect()
27*6eca135dSLisandro Dalcin        if PYSABI:
28*6eca135dSLisandro Dalcin            # garbage collection is not supported
29*6eca135dSLisandro Dalcin            # the weak reference is still alive
30*6eca135dSLisandro Dalcin            self.assertTrue(wref() is not None)
31*6eca135dSLisandro Dalcin            self.assertEqual(wref().getRefCount(), 1)
32*6eca135dSLisandro Dalcin            wref().destroy()
33*6eca135dSLisandro Dalcin        else:
34*6eca135dSLisandro Dalcin            # the weak reference is gone
355808f684SSatish Balay            self.assertTrue(wref() is None)
36*6eca135dSLisandro Dalcin        del wref
3762e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
385808f684SSatish Balay
395808f684SSatish Balay    def make_weakref(self):
406f336411SStefano Zampini        return weakref.ref(self.obj)
415808f684SSatish Balay
425808f684SSatish Balay    def testCycleInSelf(self):
435808f684SSatish Balay        self.obj.setAttr('myself', self.obj)
445808f684SSatish Balay
455808f684SSatish Balay    def testCycleInMethod(self):
465808f684SSatish Balay        self.obj.setAttr('mymeth', self.obj.view)
475808f684SSatish Balay
485808f684SSatish Balay    def testCycleInInstance(self):
496f336411SStefano Zampini        class A:
506f336411SStefano Zampini            pass
516f336411SStefano Zampini
525808f684SSatish Balay        a = A()
535808f684SSatish Balay        a.obj = self.obj
545808f684SSatish Balay        self.obj.setAttr('myinst', a)
555808f684SSatish Balay
565808f684SSatish Balay    def testCycleInAllWays(self):
575808f684SSatish Balay        self.testCycleInSelf()
585808f684SSatish Balay        self.testCycleInMethod()
595808f684SSatish Balay        self.testCycleInInstance()
605808f684SSatish Balay
616f336411SStefano Zampini
625808f684SSatish Balay# --------------------------------------------------------------------
635808f684SSatish Balay
646f336411SStefano Zampini
655808f684SSatish Balayclass TestGCVec(BaseTestGC, unittest.TestCase):
665808f684SSatish Balay    CLASS = PETSc.Vec
675808f684SSatish Balay
686f336411SStefano Zampini
695808f684SSatish Balayclass TestGCVecSubType(TestGCVec):
705808f684SSatish Balay    CLASS = type('_Vec', (PETSc.Vec,), {})
715808f684SSatish Balay
726f336411SStefano Zampini
735808f684SSatish Balayclass TestGCMat(BaseTestGC, unittest.TestCase):
745808f684SSatish Balay    CLASS = PETSc.Mat
755808f684SSatish Balay
766f336411SStefano Zampini
775808f684SSatish Balayclass TestGCMatSubType(TestGCMat):
785808f684SSatish Balay    CLASS = type('_Mat', (PETSc.Mat,), {})
795808f684SSatish Balay
806f336411SStefano Zampini
815808f684SSatish Balayclass TestGCPC(BaseTestGC, unittest.TestCase):
825808f684SSatish Balay    CLASS = PETSc.PC
835808f684SSatish Balay
846f336411SStefano Zampini
855808f684SSatish Balayclass TestGCPCSubType(TestGCPC):
865808f684SSatish Balay    CLASS = type('_PC', (PETSc.PC,), {})
875808f684SSatish Balay
886f336411SStefano Zampini
895808f684SSatish Balayclass TestGCKSP(BaseTestGC, unittest.TestCase):
905808f684SSatish Balay    CLASS = PETSc.KSP
915808f684SSatish Balay
926f336411SStefano Zampini
935808f684SSatish Balayclass TestGCKSPSubType(TestGCKSP):
945808f684SSatish Balay    CLASS = type('_KSP', (PETSc.KSP,), {})
955808f684SSatish Balay
966f336411SStefano Zampini
975808f684SSatish Balayclass TestGCSNES(BaseTestGC, unittest.TestCase):
985808f684SSatish Balay    CLASS = PETSc.SNES
996f336411SStefano Zampini
1005808f684SSatish Balay    def testCycleInAppCtx(self):
1015808f684SSatish Balay        self.obj.setAppCtx(self.obj)
1025808f684SSatish Balay
1036f336411SStefano Zampini
1045808f684SSatish Balayclass TestGCSNESSubType(TestGCSNES):
1055808f684SSatish Balay    CLASS = type('_SNES', (PETSc.SNES,), {})
1065808f684SSatish Balay
1076f336411SStefano Zampini
1085808f684SSatish Balayclass TestGCTS(BaseTestGC, unittest.TestCase):
1095808f684SSatish Balay    CLASS = PETSc.TS
1106f336411SStefano Zampini
1115808f684SSatish Balay    def testCycleInAppCtx(self):
1125808f684SSatish Balay        self.obj.setAppCtx(self.obj)
1135808f684SSatish Balay
1146f336411SStefano Zampini
1155808f684SSatish Balayclass TestGCTSSubType(TestGCTS):
1165808f684SSatish Balay    CLASS = type('_TS', (PETSc.TS,), {})
1176f336411SStefano Zampini
1185808f684SSatish Balay    def testCycleInAppCtx(self):
1195808f684SSatish Balay        self.obj.setAppCtx(self.obj)
1205808f684SSatish Balay
1216f336411SStefano Zampini
1225808f684SSatish Balay# --------------------------------------------------------------------
1235808f684SSatish Balay
1245808f684SSatish Balayif __name__ == '__main__':
1255808f684SSatish Balay    unittest.main()
126