Author: Remi Meier <[email protected]>
Branch: c8-private-pages
Changeset: r1526:4e6bc07dfd5f
Date: 2015-01-14 14:04 +0100
http://bitbucket.org/pypy/stmgc/changeset/4e6bc07dfd5f/

Log:    make 'backup' in commit log entry a slice too instead of the whole
        object

diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -60,7 +60,7 @@
         if (src_segment_base != NULL)
             src = REAL_ADDRESS(src_segment_base, oslice);
         else
-            src = undo->backup + SLICE_OFFSET(undo->slice);
+            src = undo->backup;
         dst = REAL_ADDRESS(STM_SEGMENT->segment_base, oslice);
         memcpy(dst, src, SLICE_SIZE(undo->slice));
 
@@ -504,14 +504,8 @@
         return;
     }
 
-    /* create backup copy (this may cause several page faults
-       XXX: do backup later and maybe allow for having NO_ACCESS
-       pages around anyway (kind of card marking)): */
-    struct object_s *bk_obj = malloc(obj_size);
-    memcpy(bk_obj, realobj, obj_size);
-    assert(!(bk_obj->stm_flags & GCFLAG_WB_EXECUTED));
-
-    dprintf(("write_slowpath(%p): sz=%lu, bk=%p\n", obj, obj_size, bk_obj));
+    assert(!(obj->stm_flags & GCFLAG_WB_EXECUTED));
+    dprintf(("write_slowpath(%p): sz=%lu\n", obj, obj_size));
 
  retry:
     /* privatize pages: */
@@ -521,11 +515,7 @@
     uintptr_t page;
     for (page = first_page; page <= end_page; page++) {
         if (get_page_status_in(my_segnum, page) == PAGE_NO_ACCESS) {
-            /* should not happen right now, since we do not make other
-               segment's pages NO_ACCESS anymore (later maybe in GC safe 
points) */
-            abort();
-            /* happens if there is a concurrent WB between us making the backup
-               and acquiring the locks */
+            /* XXX: slow? */
             release_all_privatization_locks();
 
             volatile char *dummy = REAL_ADDRESS(STM_SEGMENT->segment_base, 
page * 4096UL);
@@ -561,11 +551,17 @@
             slice_sz = 4096UL - in_page_offset;
         }
 
+        size_t slice_off = obj_size - remaining_obj_sz;
+
+        /* make backup slice: */
+        char *bk_slice = malloc(slice_sz);
+        memcpy(bk_slice, realobj + slice_off, slice_sz);
+
         STM_PSEGMENT->modified_old_objects = list_append3(
             STM_PSEGMENT->modified_old_objects,
             (uintptr_t)obj,     /* obj */
-            (uintptr_t)bk_obj,  /* bk_addr */
-            NEW_SLICE(obj_size - remaining_obj_sz, slice_sz));
+            (uintptr_t)bk_slice,  /* bk_addr */
+            NEW_SLICE(slice_off, slice_sz));
 
         remaining_obj_sz -= slice_sz;
         in_page_offset = (in_page_offset + slice_sz) % 4096UL; /* mostly 0 */
@@ -774,18 +770,13 @@
         char *dst = REAL_ADDRESS(pseg->pub.segment_base, obj);
 
         memcpy(dst + SLICE_OFFSET(undo->slice),
-               undo->backup + SLICE_OFFSET(undo->slice),
+               undo->backup,
                SLICE_SIZE(undo->slice));
 
-        size_t obj_size = stmcb_size_rounded_up((struct 
object_s*)undo->backup);
-        dprintf(("reset_modified_from_backup_copies(%d): obj=%p off=%lu bk=%p 
obj_sz=%lu\n",
-                 segment_num, obj, SLICE_OFFSET(undo->slice), undo->backup, 
obj_size));
+        dprintf(("reset_modified_from_backup_copies(%d): obj=%p off=%lu 
bk=%p\n",
+                 segment_num, obj, SLICE_OFFSET(undo->slice), undo->backup));
 
-        if (obj_size - SLICE_OFFSET(undo->slice) <= 4096UL) {
-            /* only free bk copy once (last slice): */
-            free(undo->backup);
-            dprintf(("-> free(%p)\n", undo->backup));
-        }
+        free(undo->backup);
     }
 
     /* check that all objects have the GCFLAG_WRITE_BARRIER afterwards */
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to