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