@support.requires_resource("cpu")
def test_enable_deferred_refcount(self):
from threading import Thread
+ import gc
self.assertEqual(_testcapi.pyobject_enable_deferred_refcount("not tracked"), 0)
foo = []
self.assertEqual(_testcapi.pyobject_enable_deferred_refcount(foo), int(support.Py_GIL_DISABLED))
+ # The object must be tracked by the GC
+ not_gc_tracked = tuple([1, 2])
+ self.assertFalse(gc.is_tracked(not_gc_tracked))
+ self.assertEqual(_testcapi.pyobject_enable_deferred_refcount(not_gc_tracked), 0)
+
# Make sure reference counting works on foo now
self.assertEqual(foo, [])
if support.Py_GIL_DISABLED:
return 0;
}
+ if (!PyObject_GC_IsTracked(op)) {
+ // When deferred refcount is enabled, the object will only be
+ // deallocated by the tracing garbage collector. So it must be tracked
+ // by the garbage collector.
+ return 0;
+ }
+
uint8_t bits = _Py_atomic_load_uint8(&op->ob_gc_bits);
if ((bits & _PyGC_BITS_DEFERRED) != 0)
{