Author: Armin Rigo <ar...@tunes.org> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit