Starting with Python 3.12 'None' is immortal, its refcount operations
are NO-OP and sys.getrefcount() will return a static value of UINT_MAX
on 64-bit and UINT_MAX >> 2 on 32-bit.
This basically transform 'test_try_again_many_times' in an almost
infinite loop and hangs the testsuite.
Detect this by checking if the refcount on 'None' is incremented after
assigning to a variable and skip the test if it's not the case.
See PEP-0683[1] for the gory details.
[1] https://peps.python.org/pep-0683/
Change-Id: Id07658245d524288ce7606cb0a011ad97068dad1
Signed-off-by: Michael Jeanson <mjeanson@debian.org>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/10381
Tested-by: jenkins <jenkins@lttng.org>
CI-Build: Michael Jeanson <mjeanson@efficios.com>
Reviewed-by: Philippe Proulx <eeppeliteloop@gmail.com>
# This verifies that we are not missing an incref of Py_None, making the
# refcount of Py_None reach 0.
def test_try_again_many_times(self):
+ # Starting with Python 3.12, `None` is immortal: its reference
+ # count operations are no-op. Skip this test in that case.
+ before = sys.getrefcount(None)
+ dummy = None # noqa: F841
+
+ if before == sys.getrefcount(None):
+ raise unittest.SkipTest("`None` is immortal")
+
class MyIter(bt2._UserMessageIterator):
def __next__(self):
raise bt2.TryAgain