[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