[pypy-commit] stmgc c8-new-page-handling: add some comments

Raemi noreply at buildbot.pypy.org
Fri Sep 19 14:54:28 CEST 2014


Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch: c8-new-page-handling
Changeset: r1403:07565910b902
Date: 2014-09-19 14:54 +0200
http://bitbucket.org/pypy/stmgc/changeset/07565910b902/

Log:	add some comments

diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -4,10 +4,48 @@
 
 
 /* ############# signal handler ############# */
-static void _update_obj_from(int from_seg, object_t *obj);
+static void _update_obj_from(int from_seg, object_t *obj)
+{
+    /* updates 'obj' in our accessible pages from another segment's
+       page or bk copy. (never touch PROT_NONE memory) */
+    /* XXXXXXX: are we sure everything is readable in from_seg??? */
+    size_t obj_size;
+
+    assert(get_priv_segment(from_seg)->privatization_lock);
+
+    /* look the obj up in the other segment's modified_old_objects to
+       get its backup copy: */
+    acquire_modified_objs_lock(from_seg);
+
+    wlog_t *item;
+    struct tree_s *tree = get_priv_segment(from_seg)->modified_old_objects;
+    TREE_FIND(tree, (uintptr_t)obj, item, goto not_found);
+
+    obj_size = stmcb_size_rounded_up((struct object_s*)item->val);
+
+    memcpy_to_accessible_pages(STM_SEGMENT->segment_num, obj,
+                               (char*)item->val, obj_size);
+
+    release_modified_objs_lock(from_seg);
+    return;
+
+ not_found:
+    /* copy from page directly (obj is unmodified) */
+    obj_size = stmcb_size_rounded_up(
+        (struct object_s*)REAL_ADDRESS(get_segment_base(from_seg), obj));
+
+    memcpy_to_accessible_pages(STM_SEGMENT->segment_num, obj,
+                               REAL_ADDRESS(get_segment_base(from_seg), obj),
+                               obj_size);
+
+    release_modified_objs_lock(from_seg);
+}
+
 
 static void copy_bk_objs_from(int from_segnum, uintptr_t pagenum)
 {
+    /* looks at all bk copies of objects overlapping page 'pagenum' and
+       copies to current segment (never touch PROT_NONE memory) */
     acquire_modified_objs_lock(from_segnum);
     struct tree_s *tree = get_priv_segment(from_segnum)->modified_old_objects;
     wlog_t *item;
@@ -17,6 +55,8 @@
         size_t obj_size = stmcb_size_rounded_up(bk_obj);
 
         if (item->addr < (pagenum + 1) * 4096UL && item->addr + obj_size > pagenum * 4096UL) {
+            /* XXX: should actually only write to pagenum, but we validate
+               afterwards anyway and abort in case we had modifications there */
             memcpy_to_accessible_pages(STM_SEGMENT->segment_num,
                                        obj, (char*)bk_obj, obj_size);
 
@@ -31,6 +71,8 @@
     uintptr_t pagenum, struct stm_commit_log_entry_s *from,
     struct stm_commit_log_entry_s *to)
 {
+    /* walk the commit log and update the page 'pagenum' until we reach
+       the same revision as our segment, or we reach the HEAD. */
     assert(all_privatization_locks_acquired());
 
     volatile struct stm_commit_log_entry_s *cl;
@@ -61,6 +103,9 @@
 
 static void bring_page_up_to_date(uintptr_t pagenum)
 {
+    /* assumes page 'pagenum' is ACCESS_NONE, privatizes it,
+       and validates to newest revision */
+
     /* XXX: bad, but no deadlocks: */
     acquire_all_privatization_locks();
 
@@ -152,41 +197,6 @@
 }
 
 
-static void _update_obj_from(int from_seg, object_t *obj)
-{
-    size_t obj_size;
-
-    assert(get_priv_segment(from_seg)->privatization_lock);
-
-    /* look the obj up in the other segment's modified_old_objects to
-       get its backup copy: */
-    acquire_modified_objs_lock(from_seg);
-
-    wlog_t *item;
-    struct tree_s *tree = get_priv_segment(from_seg)->modified_old_objects;
-    TREE_FIND(tree, (uintptr_t)obj, item, goto not_found);
-
-    obj_size = stmcb_size_rounded_up((struct object_s*)item->val);
-
-    memcpy_to_accessible_pages(STM_SEGMENT->segment_num, obj,
-                               (char*)item->val, obj_size);
-
-    release_modified_objs_lock(from_seg);
-    return;
-
- not_found:
-    /* copy from page directly (obj is unmodified) */
-    obj_size = stmcb_size_rounded_up(
-        (struct object_s*)REAL_ADDRESS(get_segment_base(from_seg), obj));
-
-    memcpy_to_accessible_pages(STM_SEGMENT->segment_num, obj,
-                               REAL_ADDRESS(get_segment_base(from_seg), obj),
-                               obj_size);
-
-    release_modified_objs_lock(from_seg);
-}
-
-
 static void _stm_validate(void *free_if_abort, bool locks_acquired)
 {
     /* go from last known entry in commit log to the


More information about the pypy-commit mailing list