Author: Remi Meier <[email protected]>
Branch: c8-faster-smallobj-sync
Changeset: r1939:916134a837e9
Date: 2015-08-17 16:25 +0200
http://bitbucket.org/pypy/stmgc/changeset/916134a837e9/
Log: Merge with use-gcc
diff --git a/c8/stm/pages.c b/c8/stm/pages.c
--- a/c8/stm/pages.c
+++ b/c8/stm/pages.c
@@ -28,7 +28,7 @@
uint64_t ta = __sync_add_and_fetch(&pages_ctl.total_allocated,
add_or_remove);
- if (ta >= pages_ctl.total_allocated_bound)
+ if (UNLIKELY(ta >= pages_ctl.total_allocated_bound))
pages_ctl.major_collection_requested = true;
return ta;
diff --git a/c8/stm/smallmalloc.c b/c8/stm/smallmalloc.c
--- a/c8/stm/smallmalloc.c
+++ b/c8/stm/smallmalloc.c
@@ -8,9 +8,9 @@
typedef struct {
uint8_t sz;
-} fpsz_t;
+} full_page_size_t;
-static fpsz_t full_pages_object_size[PAGE_SMSIZE_END - PAGE_SMSIZE_START];
+static full_page_size_t full_pages_object_size[PAGE_SMSIZE_END -
PAGE_SMSIZE_START];
/* ^^^ This array contains the size (in number of words) of the objects
in the given page, provided it's a "full page of small objects". It
is 0 if it's not such a page, if it's fully free, or if it's in
@@ -19,7 +19,7 @@
technically full yet, it will be very soon in this case).
*/
-static fpsz_t *get_fpsz(char *smallpage)
+static full_page_size_t *get_full_page_size(char *smallpage)
{
uintptr_t pagenum = (((char *)smallpage) - END_NURSERY_PAGE * 4096UL -
stm_object_pages) / 4096;
/* <= PAGE_SMSIZE_END because we may ask for it when there is no
@@ -118,7 +118,7 @@
/* Succeeded: we have a page in 'smallpage' */
*fl = smallpage->next;
- get_fpsz((char *)smallpage)->sz = n;
+ get_full_page_size((char *)smallpage)->sz = n;
return (char *)smallpage;
}
@@ -126,12 +126,15 @@
Maybe we can pick one from free_uniform_pages.
*/
smallpage = free_uniform_pages;
- if (smallpage != NULL) {
+ if (LIKELY(smallpage != NULL)) {
if (UNLIKELY(!__sync_bool_compare_and_swap(&free_uniform_pages,
smallpage,
smallpage->nextpage)))
goto retry;
+ /* got a new page: */
+ increment_total_allocated(4096);
+
/* Succeeded: we have a page in 'smallpage', which is not
initialized so far, apart from the 'nextpage' field read
above. Initialize it.
@@ -153,7 +156,7 @@
*previous = NULL;
/* The first slot is immediately returned */
- get_fpsz((char *)smallpage)->sz = n;
+ get_full_page_size((char *)smallpage)->sz = n;
return (char *)smallpage;
}
@@ -174,8 +177,6 @@
struct small_free_loc_s *result = *fl;
- increment_total_allocated(size);
-
if (UNLIKELY(result == NULL)) {
char *addr = _allocate_small_slowpath(size);
((struct object_s*)addr)->stm_flags = 0;
@@ -270,7 +271,6 @@
}
else if (!_smallmalloc_sweep_keep(p)) {
/* the location should be freed now */
- increment_total_allocated(-szword*8);
#ifdef STM_TESTS
/* fill location with 0xdd in all segs except seg0 */
int j;
@@ -300,6 +300,7 @@
any_object_remaining = true;
}
}
+
if (!any_object_remaining) {
/* give page back to free_uniform_pages and thus make it
inaccessible from all other segments again (except seg0) */
@@ -311,9 +312,14 @@
((struct small_free_loc_s *)baseptr)->nextpage = free_uniform_pages;
free_uniform_pages = (struct small_free_loc_s *)baseptr;
+
+ /* gave the page back */
+ increment_total_allocated(-4096);
}
else if (!any_object_dying) {
- get_fpsz(baseptr)->sz = szword;
+ /* this is still a full page. only in this case we set the
+ full_page_size again: */
+ get_full_page_size(baseptr)->sz = szword;
}
else {
check_order_inside_small_page(page_free);
@@ -339,9 +345,9 @@
if (*fl != NULL) {
/* the entry in full_pages_object_size[] should already be
szword. We reset it to 0. */
- fpsz_t *fpsz = get_fpsz((char *)*fl);
- assert(fpsz->sz == szword);
- fpsz->sz = 0;
+ full_page_size_t *full_page_size = get_full_page_size((char
*)*fl);
+ assert(full_page_size->sz == szword);
+ full_page_size->sz = 0;
sweep_small_page(getbaseptr(*fl), *fl, szword);
*fl = NULL;
}
@@ -351,7 +357,7 @@
while (page != NULL) {
/* for every page in small_page_lists: assert that the
corresponding full_pages_object_size[] entry is 0 */
- assert(get_fpsz((char *)page)->sz == 0);
+ assert(get_full_page_size((char *)page)->sz == 0);
nextpage = page->nextpage;
sweep_small_page(getbaseptr(page), page, szword);
page = nextpage;
@@ -361,10 +367,10 @@
/* process the really full pages, which are the ones which still
have a non-zero full_pages_object_size[] entry */
char *pageptr = uninitialized_page_stop;
- fpsz_t *fpsz_start = get_fpsz(pageptr);
- fpsz_t *fpsz_end = &full_pages_object_size[PAGE_SMSIZE_END -
- PAGE_SMSIZE_START];
- fpsz_t *fpsz;
+ full_page_size_t *fpsz_start = get_full_page_size(pageptr);
+ full_page_size_t *fpsz_end = &full_pages_object_size[PAGE_SMSIZE_END -
+ PAGE_SMSIZE_START];
+ full_page_size_t *fpsz;
for (fpsz = fpsz_start; fpsz < fpsz_end; fpsz++, pageptr += 4096) {
uint8_t sz = fpsz->sz;
if (sz != 0) {
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit