Author: Gregor Wegberg <[email protected]>
Branch: gc-incminimark-pinning
Changeset: r71867:b7aebcec86ec
Date: 2014-06-02 16:37 +0200
http://bitbucket.org/pypy/pypy/changeset/b7aebcec86ec/
Log: added additional pinning tests
diff --git a/rpython/memory/gc/test/test_object_pinning.py
b/rpython/memory/gc/test/test_object_pinning.py
--- a/rpython/memory/gc/test/test_object_pinning.py
+++ b/rpython/memory/gc/test/test_object_pinning.py
@@ -1,8 +1,11 @@
import py
from rpython.rtyper.lltypesystem import lltype, llmemory, llarena
-from rpython.memory.gc.incminimark import IncrementalMiniMarkGC
+from rpython.memory.gc.incminimark import IncrementalMiniMarkGC, WORD
from test_direct import BaseDirectGCTest
+# YYY
+from rpython.rlib.debug import debug_print
+
S = lltype.GcForwardReference()
S.become(lltype.GcStruct('pinning_test_struct',
('someInt', lltype.Signed),
@@ -148,31 +151,224 @@
adr = llmemory.cast_ptr_to_adr(self.stackroots[0])
assert not self.gc.is_in_nursery(adr)
- def test_pin_shadow_3(self):
- ptr = self.malloc(S)
- adr = llmemory.cast_ptr_to_adr(ptr)
- ptr.someInt = 100 # not used, just nice to have for identification
- self.stackroots.append(ptr)
- self.gc.id(ptr) # allocate shadow
+ def test_pin_nursery_top_scenario1(self):
+ ptr1 = self.malloc(S)
+ adr1 = llmemory.cast_ptr_to_adr(ptr1)
+ ptr1.someInt = 101
+ self.stackroots.append(ptr1)
+ assert self.gc.pin(adr1)
+
+ ptr2 = self.malloc(S)
+ adr2 = llmemory.cast_ptr_to_adr(ptr2)
+ ptr2.someInt = 102
+ self.stackroots.append(ptr2)
+ assert self.gc.pin(adr2)
- assert self.gc.pin(adr)
- self.gc.minor_collection() # object stays in nursery
- assert self.gc.is_in_nursery(adr)
+ ptr3 = self.malloc(S)
+ adr3 = llmemory.cast_ptr_to_adr(ptr3)
+ ptr3.someInt = 103
+ self.stackroots.append(ptr3)
+ assert self.gc.pin(adr3)
- self.gc.unpin(adr)
- # we still have a pinned object at the beginning. There is no space
left
- # to malloc an object before the pinned one.
- assert self.gc.is_in_nursery(adr)
+ # scenario: no minor collection happened, only three mallocs
+ # and pins
+ #
+ # +- nursery nursery_real_top -+
+ # | |
+ # v v
+ # +--------+--------+--------+---------------------...---+
+ # | pinned | pinned | pinned | empty |
+ # +--------+--------+--------+---------------------...---+
+ # ^ ^
+ # | |
+ # nursery_free -+ |
+ # nursery_top -+
+ #
+ assert adr3 < self.gc.nursery_free
+ assert self.gc.nursery_free < self.gc.nursery_top
+ assert self.gc.nursery_top == self.gc.nursery_real_top
+
+ def test_pin_nursery_top_scenario2(self):
+ ptr1 = self.malloc(S)
+ adr1 = llmemory.cast_ptr_to_adr(ptr1)
+ ptr1.someInt = 101
+ self.stackroots.append(ptr1)
+ assert self.gc.pin(adr1)
+
+ ptr2 = self.malloc(S)
+ adr2 = llmemory.cast_ptr_to_adr(ptr2)
+ ptr2.someInt = 102
+ self.stackroots.append(ptr2)
+ assert self.gc.pin(adr2)
+
+ ptr3 = self.malloc(S)
+ adr3 = llmemory.cast_ptr_to_adr(ptr3)
+ ptr3.someInt = 103
+ self.stackroots.append(ptr3)
+ assert self.gc.pin(adr3)
+
+ # scenario: after first GC minor collection
+ #
+ # +- nursery nursery_real_top -+
+ # | |
+ # v v
+ # +--------+--------+--------+---------------------...---+
+ # | pinned | pinned | pinned | empty |
+ # +--------+--------+--------+---------------------...---+
+ # ^
+ # |
+ # +- nursery_free
+ # +- nursery_top
+ #
+ self.gc.minor_collection()
+
+ assert self.gc.nursery_free == self.gc.nursery_top
+ assert self.gc.nursery_top == self.gc.nursery
+ assert self.gc.nursery_top < adr3
+ assert adr3 < self.gc.nursery_real_top
+
+ def test_pin_nursery_top_scenario3(self):
+ ptr1 = self.malloc(S)
+ adr1 = llmemory.cast_ptr_to_adr(ptr1)
+ ptr1.someInt = 101
+ self.stackroots.append(ptr1)
+ assert self.gc.pin(adr1)
+
+ ptr2 = self.malloc(S)
+ adr2 = llmemory.cast_ptr_to_adr(ptr2)
+ ptr2.someInt = 102
+ self.stackroots.append(ptr2)
+ assert self.gc.pin(adr2)
+
+ ptr3 = self.malloc(S)
+ adr3 = llmemory.cast_ptr_to_adr(ptr3)
+ ptr3.someInt = 103
+ self.stackroots.append(ptr3)
+ assert self.gc.pin(adr3)
+
+ # scenario: after unpinning first object and a minor
+ # collection
+ #
+ # +- nursery nursery_real_top -+
+ # | |
+ # v v
+ # +--------+--------+--------+---------------------...---+
+ # | empty | pinned | pinned | empty |
+ # +--------+--------+--------+---------------------...---+
+ # ^ ^
+ # | |
+ # | +- nursery_top
+ # +- nursery_free
+ #
+ self.gc.unpin(adr1)
+ self.gc.minor_collection()
+
assert self.gc.nursery_free == self.gc.nursery
- assert self.gc.nursery_top == self.gc.nursery
+ assert self.gc.nursery_top > self.gc.nursery_free
+ assert self.gc.nursery_top < adr2
+ assert adr3 < self.gc.nursery_real_top
+ def test_pin_nursery_top_scenario4(self):
+ ptr1 = self.malloc(S)
+ adr1 = llmemory.cast_ptr_to_adr(ptr1)
+ ptr1.someInt = 101
+ self.stackroots.append(ptr1)
+ assert self.gc.pin(adr1)
+
+ ptr2 = self.malloc(S)
+ adr2 = llmemory.cast_ptr_to_adr(ptr2)
+ ptr2.someInt = 102
+ self.stackroots.append(ptr2)
+ assert self.gc.pin(adr2)
+
+ ptr3 = self.malloc(S)
+ adr3 = llmemory.cast_ptr_to_adr(ptr3)
+ ptr3.someInt = 103
+ self.stackroots.append(ptr3)
+ assert self.gc.pin(adr3)
+
+ # scenario: after unpinning first & second object and a minor
+ # collection
+ #
+ # +- nursery nursery_real_top -+
+ # | |
+ # v v
+ # +-----------------+--------+---------------------...---+
+ # | empty | pinned | empty |
+ # +-----------------+--------+---------------------...---+
+ # ^ ^
+ # | |
+ # | +- nursery_top
+ # +- nursery_free
+ #
+ self.gc.unpin(adr1)
+ self.gc.unpin(adr2)
self.gc.minor_collection()
- # we don't have a pinned object any more. There is now space left at
- # the beginning of our nursery for new objects.
- adr = llmemory.cast_ptr_to_adr(self.stackroots[0])
- assert not self.gc.is_in_nursery(adr)
+
assert self.gc.nursery_free == self.gc.nursery
- assert self.gc.nursery_top > self.gc.nursery
+ assert self.gc.nursery_free < self.gc.nursery_top
+ assert self.gc.nursery_top < adr3
+ assert adr3 < self.gc.nursery_real_top
+
+ def test_pin_nursery_top_scenario5(self):
+ ptr1 = self.malloc(S)
+ adr1 = llmemory.cast_ptr_to_adr(ptr1)
+ ptr1.someInt = 101
+ self.stackroots.append(ptr1)
+ assert self.gc.pin(adr1)
+
+ ptr2 = self.malloc(S)
+ adr2 = llmemory.cast_ptr_to_adr(ptr2)
+ ptr2.someInt = 102
+ self.stackroots.append(ptr2)
+ assert self.gc.pin(adr2)
+
+ ptr3 = self.malloc(S)
+ adr3 = llmemory.cast_ptr_to_adr(ptr3)
+ ptr3.someInt = 103
+ self.stackroots.append(ptr3)
+ assert self.gc.pin(adr3)
+
+ # scenario: no minor collection happened, only three mallocs
+ # and pins
+ #
+ # +- nursery nursery_real_top -+
+ # | |
+ # v v
+ # +--------+--------+--------+---------------------...---+
+ # | pinned | pinned | pinned | empty |
+ # +--------+--------+--------+---------------------...---+
+ # ^ ^
+ # | |
+ # nursery_free -+ |
+ # nursery_top -+
+ #
+ assert adr3 < self.gc.nursery_free
+ assert self.gc.nursery_free < self.gc.nursery_top
+ assert self.gc.nursery_top == self.gc.nursery_real_top
+
+ # scenario: unpin everything and minor collection
+ #
+ # +- nursery nursery_real_top -+
+ # | |
+ # v v
+ # +----------------------------------+-------------...---+
+ # | reset arena | empty (not reset) |
+ # +----------------------------------+-------------...---+
+ # ^ ^
+ # | |
+ # +- nursery_free |
+ # nursery_top -+
+ #
+ self.gc.unpin(adr1)
+ self.gc.unpin(adr2)
+ self.gc.unpin(adr3)
+ self.gc.minor_collection()
+
+ assert self.gc.nursery_free == self.gc.nursery
+ # the following assert is important: make sure that
+ # we did not reset the whole arena used as the nursery
+ assert self.gc.nursery_top < self.gc.nursery_real_top
def test_collect_dead_pinned_objects(self):
# prepare three object, where two are stackroots
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit