Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r27:996b6b7bd70e
Date: 2013-05-26 19:43 +0200
http://bitbucket.org/pypy/stmgc/changeset/996b6b7bd70e/

Log:    A bug found by demo2

diff --git a/c3/et.c b/c3/et.c
--- a/c3/et.c
+++ b/c3/et.c
@@ -730,8 +730,10 @@
           if (cur_time & 1)
             {                    // there is another inevitable transaction
               CancelLocks(d);
+              stmgc_suspend_commit_transaction(d);
               inev_mutex_acquire();   // wait until released
               inev_mutex_release();
+              stmgc_stop_transaction(d);
               AcquireLocks(d);
               continue;
             }
diff --git a/c3/nursery.c b/c3/nursery.c
--- a/c3/nursery.c
+++ b/c3/nursery.c
@@ -212,6 +212,13 @@
     fprintf(stderr, "stop transaction\n");
 }
 
+void stmgc_suspend_commit_transaction(struct tx_descriptor *d)
+{
+    /* used only when commit is suspended by another thread being
+       inevitable.  Later stmgc_stop_transaction() will be called again. */
+    spinlock_release(d->collection_lock);
+}
+
 void stmgc_committed_transaction(struct tx_descriptor *d)
 {
     spinlock_release(d->collection_lock);
diff --git a/c3/nursery.h b/c3/nursery.h
--- a/c3/nursery.h
+++ b/c3/nursery.h
@@ -35,6 +35,7 @@
 gcptr stmgc_duplicate(gcptr, revision_t);
 void stmgc_start_transaction(struct tx_descriptor *);
 void stmgc_stop_transaction(struct tx_descriptor *);
+void stmgc_suspend_commit_transaction(struct tx_descriptor *d);
 void stmgc_committed_transaction(struct tx_descriptor *);
 void stmgc_abort_transaction(struct tx_descriptor *);
 void stmgc_init_tls(void);
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to