Author: Remi Meier <[email protected]>
Branch:
Changeset: r326:18b8edd35778
Date: 2013-07-01 11:18 +0200
http://bitbucket.org/pypy/stmgc/changeset/18b8edd35778/
Log: fix uninitialized shadowstack problem during major collection
diff --git a/c4/et.c b/c4/et.c
--- a/c4/et.c
+++ b/c4/et.c
@@ -1504,7 +1504,6 @@
revision_t i;
struct tx_descriptor *d = stm_malloc(sizeof(struct tx_descriptor));
memset(d, 0, sizeof(struct tx_descriptor));
- stmgcpage_acquire_global_lock();
struct tx_public_descriptor *pd;
i = descriptor_array_free_list;
@@ -1554,7 +1553,6 @@
(long)d->public_descriptor_index, (long)pthread_self()));
stmgcpage_init_tls();
- stmgcpage_release_global_lock();
return 1;
}
else
@@ -1567,7 +1565,6 @@
struct tx_descriptor *d = thread_descriptor;
assert(d != NULL);
assert(d->active == 0);
- stmgcpage_acquire_global_lock();
/* our nursery is empty at this point. The list 'stolen_objects'
should have been emptied at the previous minor collection and
@@ -1585,7 +1582,6 @@
if (d->tx_prev != NULL) d->tx_prev->tx_next = d->tx_next;
if (d->tx_next != NULL) d->tx_next->tx_prev = d->tx_prev;
if (d == stm_tx_head) stm_tx_head = d->tx_next;
- stmgcpage_release_global_lock();
thread_descriptor = NULL;
diff --git a/c4/gcpage.c b/c4/gcpage.c
--- a/c4/gcpage.c
+++ b/c4/gcpage.c
@@ -625,6 +625,7 @@
if (d != saved) {
/* Hack: temporarily pretend that we "are" the other thread...
*/
+ assert(d->shadowstack_end_ref && *d->shadowstack_end_ref);
thread_descriptor = d;
stm_private_rev_num = *d->private_revision_ref;
stm_read_barrier_cache = *d->read_barrier_cache_ref;
diff --git a/c4/nursery.c b/c4/nursery.c
--- a/c4/nursery.c
+++ b/c4/nursery.c
@@ -198,7 +198,8 @@
return (revision_t)p;
}
-
+ /* XXX: think about if p->h_original needs a volatile read
+ and if we need a memory fence (smp_wmb())... */
spinlock_acquire(d->public_descriptor->collection_lock, 'I');
/* old objects must have an h_original xOR be
diff --git a/c4/stmsync.c b/c4/stmsync.c
--- a/c4/stmsync.c
+++ b/c4/stmsync.c
@@ -79,12 +79,14 @@
void stm_initialize(void)
{
+ stmgcpage_acquire_global_lock();
int r = DescriptorInit();
if (r != 1)
stm_fatalerror("stm_initialize: DescriptorInit failure\n");
stmgc_init_nursery();
init_shadowstack();
//stmgcpage_init_tls();
+ stmgcpage_release_global_lock();
BeginInevitableTransaction();
}
@@ -92,10 +94,12 @@
{
stmgc_minor_collect(); /* force everything out of the nursery */
CommitTransaction();
+ stmgcpage_acquire_global_lock();
//stmgcpage_done_tls();
done_shadowstack();
stmgc_done_nursery();
DescriptorDone();
+ stmgcpage_release_global_lock();
}
/************************************************************/
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit