Author: Armin Rigo <ar...@tunes.org> Branch: gc-small-uniform Changeset: r1061:34fbe565894a Date: 2014-03-18 08:38 +0100 http://bitbucket.org/pypy/stmgc/changeset/34fbe565894a/
Log: in-progress diff --git a/c7/stm/core.c b/c7/stm/core.c --- a/c7/stm/core.c +++ b/c7/stm/core.c @@ -84,6 +84,7 @@ the common case. Otherwise, we need to compute it based on its location and size. */ if (is_small_uniform(obj)) { + abort(); page_privatize(first_page); } else { diff --git a/c7/stm/nursery.c b/c7/stm/nursery.c --- a/c7/stm/nursery.c +++ b/c7/stm/nursery.c @@ -97,7 +97,7 @@ obj->stm_flags &= ~GCFLAG_HAS_SHADOW; realobj = REAL_ADDRESS(STM_SEGMENT->segment_base, obj); size = stmcb_size_rounded_up((struct object_s *)realobj); - goto copy_large_object; + goto handle_large_object; } } /* We need to make a copy of this object. It goes either in @@ -107,25 +107,27 @@ realobj = REAL_ADDRESS(STM_SEGMENT->segment_base, obj); size = stmcb_size_rounded_up((struct object_s *)realobj); - if (1 /*size >= GC_N_SMALL_REQUESTS*8*/) { + if (size >= GC_N_SMALL_REQUESTS) { /* case 1: object is not small enough. Ask gcpage.c for an allocation via largemalloc. */ char *allocated = allocate_outside_nursery_large(size); nobj = (object_t *)(allocated - stm_object_pages); - /* Copy the object */ - copy_large_object:; - char *realnobj = REAL_ADDRESS(STM_SEGMENT->segment_base, nobj); - memcpy(realnobj, realobj, size); - + handle_large_object: nobj_sync_now = ((uintptr_t)nobj) | FLAG_SYNC_LARGE; } else { /* case "small enough" */ - abort(); //... + char *allocated = allocate_outside_nursery_small(size); + nobj = (object_t *)(allocated - stm_object_pages); + nobj_sync_now = (uintptr_t)nobj; } + /* Copy the object */ + char *realnobj = REAL_ADDRESS(STM_SEGMENT->segment_base, nobj); + memcpy(realnobj, realobj, size); + /* Done copying the object. */ //dprintf(("\t\t\t\t\t%p -> %p\n", obj, nobj)); pforwarded_array[0] = GCWORD_MOVED; @@ -153,6 +155,7 @@ /* Must trace the object later */ LIST_APPEND(STM_PSEGMENT->objects_pointing_to_nursery, nobj_sync_now); + assert(nobj_sync_now == ((uintptr_t)nobj | is_small_uniform(nobj))); } static void collect_roots_in_nursery(void) diff --git a/c7/stm/smallmalloc.c b/c7/stm/smallmalloc.c --- a/c7/stm/smallmalloc.c +++ b/c7/stm/smallmalloc.c @@ -25,7 +25,7 @@ goto out_of_memory; uninitialized_page_stop -= decrease_by; - first_small_uniform_loc = (uintptr_t)uninitialized_page_stop; + first_small_uniform_loc = uninitialized_page_stop - stm_object_pages; char *base = stm_object_pages + END_NURSERY_PAGE * 4096UL; if (!_stm_largemalloc_resize_arena(uninitialized_page_stop - base)) @@ -51,8 +51,6 @@ static char *_allocate_small_slowpath(uint64_t size) { - /* First try to grab the next page from the global 'small_page_list' - */ long n = size / 8; struct small_page_list_s *smallpage; struct small_free_loc_s *TLPREFIX *fl = @@ -60,6 +58,8 @@ assert(*fl == NULL); retry: + /* First try to grab the next page from the global 'small_page_list' + */ smallpage = small_page_lists[n]; if (smallpage != NULL) { if (UNLIKELY(!__sync_bool_compare_and_swap(&small_page_lists[n], @@ -72,8 +72,8 @@ return (char *)smallpage; } - /* There is no more page waiting. Maybe we can pick one from - free_uniform_pages. + /* There is no more page waiting for the correct size of objects. + Maybe we can pick one from free_uniform_pages. */ smallpage = free_uniform_pages; if (smallpage != NULL) { @@ -104,7 +104,8 @@ return (char *)smallpage; } - /* Not a single free page left. Grab some more free pges and retry. */ + /* Not a single free page left. Grab some more free pages and retry. + */ grab_more_free_pages_for_small_allocations(); goto retry; } _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit