Author: Remi Meier <[email protected]>
Branch: c8-private-pages
Changeset: r1538:6872a592d2bd
Date: 2015-01-16 15:31 +0100
http://bitbucket.org/pypy/stmgc/changeset/6872a592d2bd/
Log: uncomment some important code for resizing largemalloc when grabbing
new pages for smallmalloc...
diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c
--- a/c8/stm/gcpage.c
+++ b/c8/stm/gcpage.c
@@ -9,7 +9,7 @@
static void setup_gcpage(void)
{
char *base = stm_object_pages + END_NURSERY_PAGE * 4096UL;
- uintptr_t length = (NB_PAGES - END_NURSERY_PAGE) * 4096UL;
+ uintptr_t length = NB_SHARED_PAGES * 4096UL;
_stm_largemalloc_init_arena(base, length);
uninitialized_page_start = stm_object_pages + END_NURSERY_PAGE * 4096UL;
diff --git a/c8/stm/largemalloc.c b/c8/stm/largemalloc.c
--- a/c8/stm/largemalloc.c
+++ b/c8/stm/largemalloc.c
@@ -32,7 +32,7 @@
typedef struct malloc_chunk {
size_t prev_size; /* - if the previous chunk is free: size of its data
- otherwise, if this chunk is free: 1
- - otherwise, 0. */
+ - otherwise, 0. both chunks used */
size_t size; /* size of the data in this chunk */
dlist_t d; /* if free: a doubly-linked list 'largebins' */
@@ -393,6 +393,7 @@
/* unlink the following chunk */
unlink_chunk(mscan);
+
#ifndef NDEBUG
mscan->prev_size = (size_t)-258; /* 0xfffffffffffffefe */
mscan->size = (size_t)-515; /* 0xfffffffffffffdfd */
diff --git a/c8/stm/smallmalloc.c b/c8/stm/smallmalloc.c
--- a/c8/stm/smallmalloc.c
+++ b/c8/stm/smallmalloc.c
@@ -62,10 +62,8 @@
uninitialized_page_stop -= decrease_by;
first_small_uniform_loc = uninitialized_page_stop - stm_object_pages;
- /* XXX: */
- /* char *base = stm_object_pages + END_NURSERY_PAGE * 4096UL; */
- /* if (!_stm_largemalloc_resize_arena(uninitialized_page_stop - base))
*/
- /* goto out_of_memory; */
+ if (!_stm_largemalloc_resize_arena(uninitialized_page_stop -
uninitialized_page_start))
+ goto out_of_memory;
/* make writable in sharing seg */
setup_N_pages(uninitialized_page_stop, GCPAGE_NUM_PAGES);
diff --git a/c8/test/test_largemalloc.py b/c8/test/test_largemalloc.py
--- a/c8/test/test_largemalloc.py
+++ b/c8/test/test_largemalloc.py
@@ -49,6 +49,25 @@
#
lib._stm_large_dump()
+ def test_random_sweep(self):
+ @ffi.callback("bool(char *)")
+ def keep(data):
+ print "keep?", data, data not in to_free
+ return data not in to_free
+ lib._stm_largemalloc_keep = keep
+
+ OBJS = 6
+ FREE = 2
+ random.seed(12)
+ for _ in range(100):
+ allocd = {lib._stm_large_malloc(64) for _ in range(OBJS)}
+ while allocd:
+ to_free = set(random.sample(allocd, min(FREE, len(allocd))))
+ print "allocd", allocd, "free", to_free
+ lib._stm_largemalloc_sweep()
+ allocd -= to_free
+
+
def test_overflow_1(self):
d = lib._stm_large_malloc(self.size - 32)
assert ra(d) == self.rawmem + 16
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit