[pypy-commit] stmgc default: fix to make small old objs survive major gc
Raemi
noreply at buildbot.pypy.org
Wed Feb 18 15:33:50 CET 2015
Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch:
Changeset: r1633:dbbeeda92d3e
Date: 2015-02-18 10:30 +0100
http://bitbucket.org/pypy/stmgc/changeset/dbbeeda92d3e/
Log: fix to make small old objs survive major gc
diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -228,14 +228,14 @@
addr >= stm_object_pages+TOTAL_MEMORY) {
/* actual segfault, unrelated to stmgc */
fprintf(stderr, "Segmentation fault: accessing %p\n", addr);
- abort();
+ raise(SIGINT);
}
int segnum = get_segment_of_linear_address(addr);
if (segnum != STM_SEGMENT->segment_num) {
fprintf(stderr, "Segmentation fault: accessing %p (seg %d) from"
" seg %d\n", addr, segnum, STM_SEGMENT->segment_num);
- abort();
+ raise(SIGINT);
}
dprintf(("-> segment: %d\n", segnum));
@@ -244,7 +244,7 @@
if (pagenum < END_NURSERY_PAGE) {
fprintf(stderr, "Segmentation fault: accessing %p (seg %d "
"page %lu)\n", addr, segnum, pagenum);
- abort();
+ raise(SIGINT);
}
DEBUG_EXPECT_SEGFAULT(false);
diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c
--- a/c8/stm/gcpage.c
+++ b/c8/stm/gcpage.c
@@ -2,7 +2,6 @@
# error "must be compiled via stmgc.c"
#endif
-static struct list_s *testing_prebuilt_objs = NULL;
static struct tree_s *tree_prebuilt_objs = NULL; /* XXX refactor */
@@ -446,7 +445,7 @@
assert(realobj = (struct object_s*)REAL_ADDRESS(pseg->pub.segment_base, item));
assert(realobj->stm_flags & GCFLAG_WB_EXECUTED);
- /* clear VISITED and ensure WB_EXECUTED in seg0 */
+ /* clear VISITED (garbage) and ensure WB_EXECUTED in seg0 */
mark_visited_test_and_clear(item);
realobj = (struct object_s*)REAL_ADDRESS(stm_object_pages, item);
realobj->stm_flags |= GCFLAG_WB_EXECUTED;
diff --git a/c8/stm/gcpage.h b/c8/stm/gcpage.h
--- a/c8/stm/gcpage.h
+++ b/c8/stm/gcpage.h
@@ -8,7 +8,7 @@
#define GC_MAJOR_COLLECT 1.82
-
+static struct list_s *testing_prebuilt_objs;
static char *uninitialized_page_start; /* within segment 0 */
static char *uninitialized_page_stop;
diff --git a/c8/stm/smallmalloc.c b/c8/stm/smallmalloc.c
--- a/c8/stm/smallmalloc.c
+++ b/c8/stm/smallmalloc.c
@@ -196,6 +196,10 @@
memset(REAL_ADDRESS(STM_SEGMENT->segment_base, o), 0, size_rounded_up);
o->stm_flags = GCFLAG_WRITE_BARRIER;
+ if (testing_prebuilt_objs == NULL)
+ testing_prebuilt_objs = list_create();
+ LIST_APPEND(testing_prebuilt_objs, o);
+
dprintf(("_stm_allocate_old_small(%lu): %p, seg=%d, page=%lu\n",
size_rounded_up, p,
get_segment_of_linear_address(stm_object_pages + (uintptr_t)p),
@@ -204,6 +208,7 @@
return o;
}
+
/************************************************************/
static inline bool _smallmalloc_sweep_keep(char *p)
diff --git a/c8/test/test_gcpage.py b/c8/test/test_gcpage.py
--- a/c8/test/test_gcpage.py
+++ b/c8/test/test_gcpage.py
@@ -466,3 +466,10 @@
stm_major_collect()
stm_major_collect()
self.commit_transaction()
+
+ def test_small_old_surives_major(self):
+ s = stm_allocate_old_small(16)
+ self.start_transaction()
+ stm_major_collect()
+ assert stm_get_char(s) == '\0'
+ self.commit_transaction()
More information about the pypy-commit
mailing list