[pypy-commit] stmgc c7: partially implement aborting

Raemi noreply at buildbot.pypy.org
Fri Jan 17 14:53:22 CET 2014


Author: Remi Meier <remi.meier at gmail.com>
Branch: c7
Changeset: r625:90bb5600924e
Date: 2014-01-17 14:53 +0100
http://bitbucket.org/pypy/stmgc/changeset/90bb5600924e/

Log:	partially implement aborting

diff --git a/c7/core.c b/c7/core.c
--- a/c7/core.c
+++ b/c7/core.c
@@ -911,19 +911,69 @@
     stm_stop_lock();
 }
 
+
+static void reset_modified_from_other_threads()
+{
+    /* pull the right versions from other threads in order
+       to reset our pages as part of an abort */
+    
+    struct stm_list_s *modified = _STM_TL2->modified_objects;
+    char *local_base = _STM_TL2->thread_base;
+    char *remote_base = get_thread_base(1 - _STM_TL2->thread_num);
+    char *t0_base = get_thread_base(0);
+    
+    STM_LIST_FOREACH(modified, ({
+                /* note: same as push_modified_to... but src/dst swapped
+                   XXX: unify both... */
+                char *dst = REAL_ADDRESS(local_base, item);
+                char *src = REAL_ADDRESS(remote_base, item);
+                size_t size = stmcb_size((struct object_s*)src);
+                memcpy(dst, src, size);
+
+                /* copying from the other thread re-added the
+                   WRITE_BARRIER flag */
+                assert(item->stm_flags & GCFLAG_WRITE_BARRIER);
+
+                struct object_s *t0_obj = (struct object_s*)
+                    REAL_ADDRESS(t0_base, item);
+                if (t0_base != local_base) {
+                    /* clear the write-lock (WE have modified the obj) */
+                    assert(t0_obj->stm_write_lock);
+                    t0_obj->stm_write_lock = 0;
+                } else {
+                    /* done by the memcpy */
+                    assert(!t0_obj->stm_write_lock);
+                }
+            }));
+}
+
+
 void stm_abort_transaction(void)
 {
+    /* here we hold the shared lock as a reader or writer */
     assert(_STM_TL2->running_transaction);
     
-    // XXX reset all the modified objects!!
+    /* reset all the modified objects (incl. re-adding GCFLAG_WRITE_BARRIER) */
+    reset_modified_from_other_threads();
     stm_list_clear(_STM_TL2->modified_objects);
 
-    /* re-add GCFLAG_WRITE_BARRIER */
+    /* clear old_objects_to_trace (they will have the WRITE_BARRIER flag
+       set because the ones we care about are also in modified_objects) */
     stm_list_clear(_STM_TL2->old_objects_to_trace);
 
     /* clear the nursery */
+    localchar_t *nursery_base = (localchar_t*)(FIRST_NURSERY_PAGE * 4096);
+    memset((void*)real_address((object_t*)nursery_base), 0x0,
+           _STM_TL2->nursery_current - nursery_base);
+    _STM_TL2->nursery_current = nursery_base;
 
-    /* unreserve uncommitted_pages */
+    /* unreserve uncommitted_pages and mark them as SHARED again */
+        /* STM_LIST_FOREACH(_STM_TL2->uncommitted_pages, ({ */
+        /*         uintptr_t pagenum = (uintptr_t)item; */
+        /*         flag_page_private[pagenum] = SHARED_PAGE; */
+        /*     })); */
+    stm_list_clear(_STM_TL2->uncommitted_pages);
+
 
     /* XXX: forget about GCFLAG_UNCOMMITTED objects  */
     


More information about the pypy-commit mailing list