[pypy-commit] stmgc c8-new-page-handling: bugs everywhere...
Raemi
noreply at buildbot.pypy.org
Fri Sep 19 13:42:33 CEST 2014
Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch: c8-new-page-handling
Changeset: r1398:22825b514b8b
Date: 2014-09-19 13:41 +0200
http://bitbucket.org/pypy/stmgc/changeset/22825b514b8b/
Log: bugs everywhere...
diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -359,6 +359,7 @@
struct object_s *bk_obj = malloc(obj_size);
memcpy(bk_obj, realobj, obj_size);
+ retry:
/* privatize pages: */
acquire_all_privatization_locks();
@@ -368,14 +369,19 @@
if (get_page_status_in(my_segnum, page) == PAGE_NO_ACCESS) {
/* happens if there is a concurrent WB between us making the backup
and acquiring the locks */
+ release_all_privatization_locks();
+
volatile char *dummy = REAL_ADDRESS(STM_SEGMENT->segment_base, page * 4096UL);
*dummy = *dummy; /* force segfault */
+
+ goto retry;
}
assert(get_page_status_in(my_segnum, page) != PAGE_NO_ACCESS);
if (get_page_status_in(my_segnum, page) == PAGE_PRIVATE)
continue;
+ assert(get_page_status_in(my_segnum, page) == PAGE_SHARED);
/* make sure all the others are NO_ACCESS
choosing to make us PRIVATE is harder because then nobody must ever
update the shared page in stm_validate() except if it is the sole
diff --git a/c8/stm/pages.h b/c8/stm/pages.h
--- a/c8/stm/pages.h
+++ b/c8/stm/pages.h
@@ -22,7 +22,6 @@
#define PAGE_FLAG_END NB_PAGES
/* == NB_SHARED_PAGES */
-
struct page_shared_s {
#if NB_SEGMENTS <= 4
uint8_t by_segment;
@@ -68,21 +67,23 @@
static inline uint8_t get_page_status_in(long segnum, uintptr_t pagenum)
{
int seg_shift = segnum * 2;
- uint64_t bitmask = 3UL << seg_shift;
+ OPT_ASSERT(seg_shift < 8 * sizeof(struct page_shared_s));
volatile struct page_shared_s *ps = (volatile struct page_shared_s *)
&pages_status[get_file_page_of(pagenum)];
- return ((ps->by_segment & bitmask) >> seg_shift) & 3;
+ return (ps->by_segment >> seg_shift) & 3;
}
static inline void set_page_status_in(long segnum, uintptr_t pagenum, uint8_t status)
{
- OPT_ASSERT((status & 3) == status);
+ OPT_ASSERT(status < 3);
int seg_shift = segnum * 2;
+ OPT_ASSERT(seg_shift < 8 * sizeof(struct page_shared_s));
volatile struct page_shared_s *ps = (volatile struct page_shared_s *)
&pages_status[get_file_page_of(pagenum)];
assert(status != get_page_status_in(segnum, pagenum));
- ps->by_segment |= status << seg_shift;
+ ps->by_segment &= ~(3UL << seg_shift); /* clear */
+ ps->by_segment |= status << seg_shift; /* set */
}
diff --git a/c8/stm/setup.c b/c8/stm/setup.c
--- a/c8/stm/setup.c
+++ b/c8/stm/setup.c
@@ -260,6 +260,15 @@
_init_shadow_stack(tl);
set_gs_register(get_segment_base(num));
s_mutex_unlock();
+
+ if (num == 0) {
+ dprintf(("STM_GC_NURSERY: %d\n", STM_GC_NURSERY));
+ dprintf(("NB_PAGES: %d\n", NB_PAGES));
+ dprintf(("NB_SEGMENTS: %d\n", NB_SEGMENTS));
+ dprintf(("FIRST_OBJECT_PAGE=FIRST_NURSERY_PAGE: %lu\n", FIRST_OBJECT_PAGE));
+ dprintf(("END_NURSERY_PAGE: %lu\n", END_NURSERY_PAGE));
+ dprintf(("NB_SHARED_PAGES: %lu\n", NB_SHARED_PAGES));
+ }
}
void stm_unregister_thread_local(stm_thread_local_t *tl)
More information about the pypy-commit
mailing list