Author: Remi Meier <meier...@student.ethz.ch>
Branch: implement-id
Changeset: r218:7ed5c33f287e
Date: 2013-06-20 21:09 +0200
http://bitbucket.org/pypy/stmgc/changeset/7ed5c33f287e/

Log:    doesn't crash

diff --git a/c4/nursery.c b/c4/nursery.c
--- a/c4/nursery.c
+++ b/c4/nursery.c
@@ -59,7 +59,7 @@
     assert(tid == (tid & STM_USER_TID_MASK));
     P->h_tid = tid;
     P->h_revision = stm_private_rev_num;
-    P->h_original = NULL;
+    P->h_original = 0;
     return P;
 }
 
@@ -77,7 +77,7 @@
     if (P->h_original)
         L->h_original = P->h_original;
     else
-        L->h_original = P;
+        L->h_original = (revision_t)P;
 
     return L;
 }
@@ -93,7 +93,7 @@
     if (P->h_original)
         L->h_original = P->h_original;
     else
-        L->h_original = P;
+        L->h_original = (revision_t)P;
 
     return L;
 }
@@ -114,28 +114,21 @@
     
     //p->h_original == NULL
     if (!(p->h_tid & GCFLAG_OLD)) {//(is_in_nursery(p)) {
-        // preallocate old "original" outside
+        struct tx_descriptor *d = thread_descriptor;
+        spinlock_acquire(d->public_descriptor->collection_lock, 'I');
+        // preallocate old "original" outside;
         // like stealing
-        gcptr O = stmgc_duplicate_old(L);
-        L->h_revision = (revision_t)O;
-        L->h_original = O;
-        L->h_tid |= GCFLAG_HAS_ID;
+        gcptr O = stmgc_duplicate_old(p);
+        p->h_revision = (revision_t)O;
+        p->h_original = (revision_t)O;
+        p->h_tid |= GCFLAG_HAS_ID;
         
-        
-        // could be stolen
-        if (p->h_tid & GCFLAG_NURSERY_MOVED) {
-            
-        }
-    }
-    else if (p->h_tid & GCFLAG_NURSERY_MOVED) {
-        if (p->h_tid & GCFLAG_PUBLIC) {
-            // moved by stealing
-            
-        }
-       
+        spinlock_release(d->public_descriptor->collection_lock);
+        return (revision_t)O;
     }
     else {
-        assert(0);
+        // p is the original itself
+        return (revision_t)p;
     }
 }
 
@@ -161,7 +154,7 @@
     return fresh_old_copy;
 }
 
-static inline void copy_to_old_id_copy(gcptr obj, gcptr id)
+inline void copy_to_old_id_copy(gcptr obj, gcptr id)
 {
     size_t size = stmcb_size(obj);
     memcpy(id, obj, size);
@@ -191,7 +184,8 @@
 
         if (obj->h_tid & GCFLAG_HAS_ID) {
             /* already has a place to go to */
-            fresh_old_copy = copy_to_old_id_copy(obj, obj->h_original);
+            copy_to_old_id_copy(obj, (gcptr)obj->h_original);
+            fresh_old_copy = (gcptr)obj->h_original;
         } 
         else {
             /* make a copy of it outside */
diff --git a/c4/steal.c b/c4/steal.c
--- a/c4/steal.c
+++ b/c4/steal.c
@@ -11,6 +11,8 @@
     struct stm_object_s stubs[STUB_NB_OBJS];
 };
 
+inline void copy_to_old_id_copy(gcptr obj, gcptr id);
+
 gcptr stm_stub_malloc(struct tx_public_descriptor *pd)
 {
     assert(pd->collection_lock != 0);
@@ -152,16 +154,16 @@
         if (!(L->h_tid & GCFLAG_OLD)) { 
             gcptr O;
             if (L->h_tid & GCFLAG_HAS_ID) {
+                O = (gcptr)L->h_original;
                 L->h_tid &= ~GCFLAG_HAS_ID;
-                L->h_revision = (revision_t)L->h_original;
-                copy_to_old_id_copy(L, L->h_original);
-                O = L->h_original;
+                L->h_revision = (revision_t)O;
+                copy_to_old_id_copy(L, (gcptr)L->h_original);
             } else {
                 /* Copy the object out of the other thread's nursery, 
                    if needed */
                 O = stmgc_duplicate_old(L);
                 L->h_revision = (revision_t)O;
-                L->h_original = O;
+                L->h_original = (revision_t)O;
             }
             L->h_tid |= GCFLAG_PUBLIC | GCFLAG_NURSERY_MOVED;
             /* subtle: we need to remove L from the fxcache of the target
diff --git a/c4/steal.h b/c4/steal.h
--- a/c4/steal.h
+++ b/c4/steal.h
@@ -2,7 +2,7 @@
 #define _SRCSTM_STEAL_H
 
 
-#define STUB_BLOCK_SIZE   (16 * WORD)    /* power of two */
+#define STUB_BLOCK_SIZE   (32 * WORD)    /* power of two */
 
 #define STUB_THREAD(h)    (*(struct tx_public_descriptor **)           \
                             (((revision_t)(h)) & ~(STUB_BLOCK_SIZE-1)))
diff --git a/c4/stmgc.h b/c4/stmgc.h
--- a/c4/stmgc.h
+++ b/c4/stmgc.h
@@ -10,7 +10,7 @@
 typedef struct stm_object_s {
     revision_t h_tid;
     revision_t h_revision;
-    gcptr h_original;
+    revision_t h_original;
 } *gcptr;
 
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to