Author: Remi Meier <[email protected]>
Branch: stmgc-c8
Changeset: r76679:cd4d873b68c0
Date: 2015-04-01 16:04 +0200
http://bitbucket.org/pypy/pypy/changeset/cd4d873b68c0/

Log:    import stmgc-c8 1062987da64f

diff --git a/rpython/translator/stm/src_stm/revision 
b/rpython/translator/stm/src_stm/revision
--- a/rpython/translator/stm/src_stm/revision
+++ b/rpython/translator/stm/src_stm/revision
@@ -1,1 +1,1 @@
-f6788cf5fb73
+1062987da64f
diff --git a/rpython/translator/stm/src_stm/stm/nursery.c 
b/rpython/translator/stm/src_stm/stm/nursery.c
--- a/rpython/translator/stm/src_stm/stm/nursery.c
+++ b/rpython/translator/stm/src_stm/stm/nursery.c
@@ -106,7 +106,6 @@
             /* case "small enough" */
             nobj = (object_t *)allocate_outside_nursery_small(size);
         }
-
         //dprintf(("move %p -> %p\n", obj, nobj));
 
         /* copy the object */
@@ -143,6 +142,9 @@
     /* Must trace the object later */
     LIST_APPEND(STM_PSEGMENT->objects_pointing_to_nursery, nobj_sync_now);
     _cards_cleared_in_object(get_priv_segment(STM_SEGMENT->segment_num), nobj, 
true);
+
+    assert(IMPLY(obj_should_use_cards(STM_SEGMENT->segment_base, nobj),
+                 (((uintptr_t)nobj) & 15) == 0));
 }
 
 static void _cards_cleared_in_object(struct stm_priv_segment_info_s *pseg, 
object_t *obj,
diff --git a/rpython/translator/stm/src_stm/stm/sync.c 
b/rpython/translator/stm/src_stm/stm/sync.c
--- a/rpython/translator/stm/src_stm/stm/sync.c
+++ b/rpython/translator/stm/src_stm/stm/sync.c
@@ -105,18 +105,25 @@
 
 void stm_wait_for_current_inevitable_transaction(void)
 {
+ restart:
+    /* make sure there is no major collection happening, which
+       could free some commit log entries */
+    s_mutex_lock();
+
     struct stm_commit_log_entry_s *current = 
STM_PSEGMENT->last_commit_log_entry;
 
     /* XXX: don't do busy-waiting */
-    while (1) {
-        if (current->next == NULL) {
-            break;
-        } else if (current->next == INEV_RUNNING) {
+    while (current->next != NULL) {
+        if (current->next == INEV_RUNNING) {
+            s_mutex_unlock();
             usleep(10);
-            continue;
+            /* some major collection could have freed "current", so
+               restart from the beginning */
+            goto restart;
         }
         current = current->next;
     }
+    s_mutex_unlock();
 }
 
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to