Author: Armin Rigo <[email protected]>
Branch: c7-refactor
Changeset: r814:9a45fb18c2da
Date: 2014-02-23 15:29 +0100
http://bitbucket.org/pypy/stmgc/changeset/9a45fb18c2da/
Log: Fixes for the test.
diff --git a/c7/stm/misc.c b/c7/stm/misc.c
--- a/c7/stm/misc.c
+++ b/c7/stm/misc.c
@@ -52,3 +52,24 @@
{
return ((stm_creation_marker_t *)(((uintptr_t)obj) >> 8))->cm;
}
+
+#ifdef STM_TESTS
+object_t *_stm_enum_old_objects_pointing_to_young(void)
+{
+ static long index = 0;
+ struct list_s *lst = STM_PSEGMENT->old_objects_pointing_to_young;
+ if (index < list_count(lst))
+ return (object_t *)list_item(lst, index++);
+ index = 0;
+ return (object_t *)-1;
+}
+object_t *_stm_enum_modified_objects(void)
+{
+ static long index = 0;
+ struct list_s *lst = STM_PSEGMENT->modified_objects;
+ if (index < list_count(lst))
+ return (object_t *)list_item(lst, index++);
+ index = 0;
+ return (object_t *)-1;
+}
+#endif
diff --git a/c7/stm/nursery.c b/c7/stm/nursery.c
--- a/c7/stm/nursery.c
+++ b/c7/stm/nursery.c
@@ -159,6 +159,7 @@
/* Copy the object to segment 0 (as a first step) */
memcpy(copyobj, realobj, size);
+ ((struct object_s *)copyobj)->stm_flags |= GCFLAG_WRITE_BARRIER_CALLED;
nobj = (object_t *)(copyobj - stm_object_pages);
@@ -193,6 +194,8 @@
for (i = 1; i < NB_SEGMENTS; i++) {
uintptr_t diff = get_segment_base(i) - stm_object_pages;
memcpy(copyobj + diff, realobj + diff, size);
+ ((struct object_s *)(copyobj + diff))->stm_flags |=
+ GCFLAG_WRITE_BARRIER_CALLED;
}
}
@@ -224,6 +227,7 @@
}
/* Done copying the object. */
+ //dprintf(("%p -> %p\n", obj, nobj));
pforwarded_array[0] = GCWORD_MOVED;
pforwarded_array[1] = nobj;
*pobj = nobj;
diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -98,6 +98,8 @@
void _stm_start_safe_point(void);
void _stm_stop_safe_point(void);
void _stm_set_nursery_free_count(uint64_t free_count);
+object_t *_stm_enum_old_objects_pointing_to_young(void);
+object_t *_stm_enum_modified_objects(void);
#endif
#define _STM_GCFLAG_WRITE_BARRIER_CALLED 0x80
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -76,50 +76,12 @@
void _stm_set_nursery_free_count(uint64_t free_count);
ssize_t stmcb_size_rounded_up(struct object_s *obj);
+
+object_t *_stm_enum_old_objects_pointing_to_young(void);
+object_t *_stm_enum_modified_objects(void);
""")
-TEMPORARILY_DISABLED = """
-void stm_start_inevitable_transaction(stm_thread_local_t *tl);
-
-void _stm_minor_collect();
-
-void *memset(void *s, int c, size_t n);
-extern size_t stmcb_size(struct object_s *);
-extern void stmcb_trace(struct object_s *, void (object_t **));
-
-uint8_t _stm_get_flags(object_t *obj);
-uint8_t stm_get_page_flag(int pagenum);
-enum {
- SHARED_PAGE=0,
- REMAPPING_PAGE,
- PRIVATE_PAGE,
-}; /* flag_page_private */
-
-enum {
- GCFLAG_WRITE_BARRIER = 1,
- GCFLAG_NOT_COMMITTED = 2,
- GCFLAG_MOVED = 4,
-};
-
-void stm_largemalloc_init(char *data_start, size_t data_size);
-int stm_largemalloc_resize_arena(size_t new_size);
-
-object_t *stm_large_malloc(size_t request_size);
-void stm_large_free(object_t *data);
-
-void _stm_large_dump(void);
-char *_stm_largemalloc_data_start(void);
-
-void _stm_move_object(object_t* obj, char *src, char *dst);
-size_t _stm_data_size(struct object_s *data);
-void _stm_chunk_pages(struct object_s *data, uintptr_t *start, uintptr_t *num);
-
-void stm_become_inevitable(char* msg);
-void stm_start_inevitable_transaction();
-"""
-
-
lib = ffi.verify('''
#include <stdlib.h>
#include <string.h>
@@ -222,6 +184,9 @@
void _set_ptr(object_t *obj, int n, object_t *v)
{
+ int nrefs = ((myobj_t*)obj)->type_id - 421420;
+ assert(n < nrefs);
+
stm_char *field_addr = ((stm_char*)obj);
field_addr += SIZEOF_MYOBJ; /* header */
field_addr += n * sizeof(void*); /* field */
@@ -231,6 +196,9 @@
object_t * _get_ptr(object_t *obj, int n)
{
+ int nrefs = ((myobj_t*)obj)->type_id - 421420;
+ assert(n < nrefs);
+
stm_char *field_addr = ((stm_char*)obj);
field_addr += SIZEOF_MYOBJ; /* header */
field_addr += n * sizeof(void*); /* field */
@@ -396,6 +364,15 @@
def stm_get_flags(o):
return lib._stm_get_flags(o)
+def old_objects_pointing_to_young():
+ return list(iter(lib._stm_enum_old_objects_pointing_to_young,
+ ffi.cast("object_t *", -1)))
+
+def modified_objects():
+ return list(iter(lib._stm_enum_modified_objects,
+ ffi.cast("object_t *", -1)))
+
+
SHADOWSTACK_LENGTH = 100
_keepalive = weakref.WeakKeyDictionary()
diff --git a/c7/test/test_basic.py b/c7/test/test_basic.py
--- a/c7/test/test_basic.py
+++ b/c7/test/test_basic.py
@@ -50,6 +50,7 @@
assert stm_was_written(lp1)
stm_write(lp1)
assert stm_was_written(lp1)
+ assert modified_objects() == [] # because same transaction
self.commit_transaction()
def test_allocate_old(self):
@@ -83,7 +84,9 @@
#
self.switch(1)
self.start_transaction()
+ assert modified_objects() == []
stm_write(lp1)
+ assert modified_objects() == [lp1]
assert stm_get_char(lp1) == 'a'
stm_set_char(lp1, 'b')
#
diff --git a/c7/test/test_nursery.py b/c7/test/test_nursery.py
--- a/c7/test/test_nursery.py
+++ b/c7/test/test_nursery.py
@@ -66,20 +66,41 @@
# make a long, ever-growing linked list of objects, in one transaction
lib._stm_set_nursery_free_count(NURSERY_SECTION_SIZE * 2)
self.start_transaction()
- lp1 = stm_allocate(16)
+ lp1 = stm_allocate_refs(1)
self.push_root(lp1)
- lp2 = lp1
- N = (NURSERY_SECTION_SIZE * 5) / 16
+ prev = lp1
+ prevprev = None
+ FIT = (NURSERY_SECTION_SIZE * 2) / 16 - 1 # without 'lp1' above
+ N = (NURSERY_SECTION_SIZE * 4) / 16 + 41
for i in range(N):
- self.push_root(lp2)
- lp3 = stm_allocate(16)
- lp2 = self.pop_root()
- stm_set_ref(lp2, 0, lp3)
- lp2 = lp3
+ if prevprev:
+ assert stm_get_ref(prevprev, 0) == prev
+ self.push_root(prevprev)
+ self.push_root(prev)
+ lp3 = stm_allocate_refs(1)
+ prev = self.pop_root()
+ if prevprev:
+ prevprev = self.pop_root()
+ assert prevprev != prev
+ stm_set_ref(prev, 0, lp3)
+ prevprev = prev
+ prev = lp3
+
+ seeme = old_objects_pointing_to_young()
+ if i < FIT:
+ assert len(seeme) == 0 # no minor collection so far
+ else:
+ assert len(seeme) == 1 # the one from the prev minor coll
+
lp1 = self.pop_root()
+ assert modified_objects() == []
+
lp2 = lp1
for i in range(N):
assert lp2
+ assert stm_creation_marker(lp2) == (0xff if is_in_nursery(lp2)
+ else 0x01)
+ prev = lp2
lp2 = stm_get_ref(lp2, 0)
assert lp2 == lp3
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit