[pypy-commit] stmgc c7-refactor: More prebuilt stuff from two days ago. Might get changed soon.

arigo noreply at buildbot.pypy.org
Fri Feb 14 14:22:27 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: c7-refactor
Changeset: r728:f1f127c63039
Date: 2014-02-13 13:49 +0100
http://bitbucket.org/pypy/stmgc/changeset/f1f127c63039/

Log:	More prebuilt stuff from two days ago. Might get changed soon.

diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -30,6 +30,7 @@
         perror("madvise");
         abort();
     }
+    reset_transaction_read_version_prebuilt();
     STM_SEGMENT->transaction_read_version = 1;
 }
 
diff --git a/c7/stm/gcpage.c b/c7/stm/gcpage.c
--- a/c7/stm/gcpage.c
+++ b/c7/stm/gcpage.c
@@ -12,9 +12,9 @@
 object_t *_stm_allocate_old(ssize_t size_rounded_up)
 {
     char *addr = large_malloc(size_rounded_up);
-    memset(addr, 0, size_rounded_up);
+    object_t* o = (object_t *)(addr - stm_object_pages);
 
-    object_t* o = (object_t *)(addr - stm_object_pages);
+    memset(REAL_ADDRESS(STM_SEGMENT->segment_base, o), 0, size_rounded_up);
     o->stm_flags = GCFLAG_WRITE_BARRIER;
     return o;
 }
diff --git a/c7/stm/prebuilt.c b/c7/stm/prebuilt.c
--- a/c7/stm/prebuilt.c
+++ b/c7/stm/prebuilt.c
@@ -3,6 +3,11 @@
 #endif
 
 
+static uint64_t prebuilt_readmarkers_start = 0;
+static uint64_t prebuilt_readmarkers_end   = 0;
+static uint64_t prebuilt_objects_start     = 0;
+
+
 void stm_copy_prebuilt_objects(object_t *target, char *source, ssize_t size)
 {
     /* Initialize a region of 'size' bytes at the 'target' address,
@@ -23,19 +28,51 @@
        with STM_FLAGS_PREBUILT.
     */
 
-    uintptr_t utarget = (uintptr_t)target;
-    if (utarget / 16 < 8192 ||
-            utarget + size > FIRST_READMARKER_PAGE * 4096UL ||
-            (utarget + size + 15) / 16 > utarget) {
+    uint64_t utarget = (uint64_t)target;
+    uint64_t rm_start = utarget / 16;
+    uint64_t rm_end   = (utarget + size + 15) / 16;
+
+    if (rm_start < 8192 || rm_end > (utarget & ~4095) ||
+            utarget + size > FIRST_READMARKER_PAGE * 4096UL) {
         fprintf(stderr,
-                "stm_copy_prebuilt_objects: invalid range (%ld, %ld)",
+                "stm_copy_prebuilt_objects: invalid range (0x%lx, 0x%lx)\n",
                 (long)utarget, (long)size);
         abort();
     }
-    uintptr_t start_page = utarget / 4096;
-    uintptr_t end_page = (utarget + size + 4095) / 4096;
+
+    if (prebuilt_readmarkers_start == 0) {
+        prebuilt_readmarkers_start = rm_start;
+        prebuilt_readmarkers_end   = rm_end;
+        prebuilt_objects_start     = utarget & ~4095;
+    }
+    else {
+        if (prebuilt_readmarkers_start > rm_start)
+            prebuilt_readmarkers_start = rm_start;
+        if (prebuilt_readmarkers_end < rm_end)
+            prebuilt_readmarkers_end = rm_end;
+        if (prebuilt_objects_start > (utarget & ~4095))
+            prebuilt_objects_start = utarget & ~4095;
+
+        if (prebuilt_readmarkers_end > prebuilt_objects_start) {
+            fprintf(stderr,
+                    "stm_copy_prebuilt_objects: read markers ending at 0x%lx "
+                    "overlap with prebuilt objects starting at 0x%lx\n",
+                    (long)prebuilt_readmarkers_end,
+                    (long)prebuilt_objects_start);
+            abort();
+        }
+    }
+
+    uint64_t start_page = utarget / 4096;
+    uint64_t end_page = (utarget + size + 4095) / 4096;
     pages_initialize_shared(start_page, end_page - start_page);
 
     char *segment_base = get_segment_base(0);
     memcpy(REAL_ADDRESS(segment_base, utarget), source, size);
 }
+
+static void reset_transaction_read_version_prebuilt(void)
+{
+    memset(REAL_ADDRESS(STM_SEGMENT->segment_base, prebuilt_readmarkers_start),
+           0, prebuilt_readmarkers_end - prebuilt_readmarkers_start);
+}


More information about the pypy-commit mailing list