File: test_minimark_gc.py

package info (click to toggle)
pypy 7.0.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 107,216 kB
  • sloc: python: 1,201,787; ansic: 62,419; asm: 5,169; cpp: 3,017; sh: 2,534; makefile: 545; xml: 243; lisp: 45; awk: 4
file content (48 lines) | stat: -rw-r--r-- 1,610 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from rpython.rlib import rgc
from rpython.rlib.rarithmetic import LONG_BIT

from rpython.memory.test import test_semispace_gc

WORD = LONG_BIT // 8

class TestMiniMarkGC(test_semispace_gc.TestSemiSpaceGC):
    from rpython.memory.gc.minimark import MiniMarkGC as GCClass
    GC_CAN_SHRINK_BIG_ARRAY = False
    GC_CAN_MALLOC_NONMOVABLE = True
    BUT_HOW_BIG_IS_A_BIG_STRING = 11*WORD

    def test_bounded_memory_when_allocating_with_finalizers(self):
        # Issue #2590: when allocating a lot of objects with a finalizer
        # and little else, the bounds in the (inc)minimark GC are not
        # set up reasonably and the total memory usage grows without
        # limit.
        class B(object):
            pass
        b = B()
        b.num_deleted = 0
        class A(object):
            def __init__(self):
                fq.register_finalizer(self)
        class FQ(rgc.FinalizerQueue):
            Class = A
            def finalizer_trigger(self):
                while True:
                    a = self.next_dead()
                    if a is None:
                        break
                    b.num_deleted += 1
        fq = FQ()
        def f(x, y):
            i = 0
            alive_max = 0
            while i < x:
                i += 1
                a = A()
                a.x = a.y = a.z = i
                #print i - b.num_deleted, b.num_deleted
                alive = i - b.num_deleted
                assert alive >= 0
                alive_max = max(alive_max, alive)
            return alive_max
        res = self.interpret(f, [1000, 0])
        assert res < 100