SILENT KILLERPanel

Current Path: > > opt > hc_python > lib64 > python3.12 > site-packages > greenlet > tests


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //opt/hc_python/lib64/python3.12/site-packages/greenlet/tests

NameTypeSizeLast ModifiedActions
__pycache__ Directory - -
__init__.py File 9361 bytes May 23 2025 10:34:46.
_test_extension.c File 5773 bytes May 23 2025 10:34:46.
_test_extension.cpython-312-x86_64-linux-gnu.so File 17256 bytes May 23 2025 10:34:46.
_test_extension_cpp.cpp File 6565 bytes May 23 2025 10:34:46.
_test_extension_cpp.cpython-312-x86_64-linux-gnu.so File 58384 bytes May 23 2025 10:34:46.
fail_clearing_run_switches.py File 1263 bytes May 23 2025 10:34:46.
fail_cpp_exception.py File 985 bytes May 23 2025 10:34:46.
fail_initialstub_already_started.py File 1961 bytes May 23 2025 10:34:46.
fail_slp_switch.py File 524 bytes May 23 2025 10:34:46.
fail_switch_three_greenlets.py File 956 bytes May 23 2025 10:34:46.
fail_switch_three_greenlets2.py File 1285 bytes May 23 2025 10:34:46.
fail_switch_two_greenlets.py File 817 bytes May 23 2025 10:34:46.
leakcheck.py File 11964 bytes May 23 2025 10:34:46.
test_contextvars.py File 10541 bytes May 23 2025 10:34:46.
test_cpp.py File 2736 bytes May 23 2025 10:34:46.
test_extension_interface.py File 3829 bytes May 23 2025 10:34:46.
test_gc.py File 2923 bytes May 23 2025 10:34:46.
test_generator.py File 1240 bytes May 23 2025 10:34:46.
test_generator_nested.py File 3718 bytes May 23 2025 10:34:46.
test_greenlet.py File 46251 bytes May 23 2025 10:34:46.
test_greenlet_trash.py File 7947 bytes May 23 2025 10:34:46.
test_leaks.py File 17714 bytes May 23 2025 10:34:46.
test_stack_saved.py File 446 bytes May 23 2025 10:34:46.
test_throw.py File 3712 bytes May 23 2025 10:34:46.
test_tracing.py File 8250 bytes May 23 2025 10:34:46.
test_version.py File 1339 bytes May 23 2025 10:34:46.
test_weakref.py File 883 bytes May 23 2025 10:34:46.

Reading File: //opt/hc_python/lib64/python3.12/site-packages/greenlet/tests/test_gc.py

import gc

import weakref

import greenlet


from . import TestCase
from .leakcheck import fails_leakcheck
# These only work with greenlet gc support
# which is no longer optional.
assert greenlet.GREENLET_USE_GC

class GCTests(TestCase):
    def test_dead_circular_ref(self):
        o = weakref.ref(greenlet.greenlet(greenlet.getcurrent).switch())
        gc.collect()
        if o() is not None:
            import sys
            print("O IS NOT NONE.", sys.getrefcount(o()))
        self.assertIsNone(o())
        self.assertFalse(gc.garbage, gc.garbage)

    def test_circular_greenlet(self):
        class circular_greenlet(greenlet.greenlet):
            self = None
        o = circular_greenlet()
        o.self = o
        o = weakref.ref(o)
        gc.collect()
        self.assertIsNone(o())
        self.assertFalse(gc.garbage, gc.garbage)

    def test_inactive_ref(self):
        class inactive_greenlet(greenlet.greenlet):
            def __init__(self):
                greenlet.greenlet.__init__(self, run=self.run)

            def run(self):
                pass
        o = inactive_greenlet()
        o = weakref.ref(o)
        gc.collect()
        self.assertIsNone(o())
        self.assertFalse(gc.garbage, gc.garbage)

    @fails_leakcheck
    def test_finalizer_crash(self):
        # This test is designed to crash when active greenlets
        # are made garbage collectable, until the underlying
        # problem is resolved. How does it work:
        # - order of object creation is important
        # - array is created first, so it is moved to unreachable first
        # - we create a cycle between a greenlet and this array
        # - we create an object that participates in gc, is only
        #   referenced by a greenlet, and would corrupt gc lists
        #   on destruction, the easiest is to use an object with
        #   a finalizer
        # - because array is the first object in unreachable it is
        #   cleared first, which causes all references to greenlet
        #   to disappear and causes greenlet to be destroyed, but since
        #   it is still live it causes a switch during gc, which causes
        #   an object with finalizer to be destroyed, which causes stack
        #   corruption and then a crash

        class object_with_finalizer(object):
            def __del__(self):
                pass
        array = []
        parent = greenlet.getcurrent()
        def greenlet_body():
            greenlet.getcurrent().object = object_with_finalizer()
            try:
                parent.switch()
            except greenlet.GreenletExit:
                print("Got greenlet exit!")
            finally:
                del greenlet.getcurrent().object
        g = greenlet.greenlet(greenlet_body)
        g.array = array
        array.append(g)
        g.switch()
        del array
        del g
        greenlet.getcurrent()
        gc.collect()

SILENT KILLER Tool