Author: Armin Rigo <[email protected]>
Branch:
Changeset: r148:d7c0041a6fa2
Date: 2013-06-16 15:32 +0200
http://bitbucket.org/pypy/stmgc/changeset/d7c0041a6fa2/
Log: in-progress
diff --git a/c4/et.c b/c4/et.c
--- a/c4/et.c
+++ b/c4/et.c
@@ -1363,6 +1363,7 @@
assert(d->active == 0);
assert(d->public_descriptor->stolen_objects.size == 0);
gcptrlist_delete(&d->public_descriptor->stolen_objects);
+ gcptrlist_delete(&d->public_descriptor->stolen_young_stubs);
spinlock_acquire(descriptor_array_lock, 1);
i = d->public_descriptor_index;
diff --git a/c4/et.h b/c4/et.h
--- a/c4/et.h
+++ b/c4/et.h
@@ -112,6 +112,7 @@
struct stub_block_s *stub_blocks;
gcptr stub_free_list;
struct GcPtrList stolen_objects;
+ struct GcPtrList stolen_young_stubs;
revision_t free_list_next;
/* xxx gcpage data here */
};
diff --git a/c4/nursery.c b/c4/nursery.c
--- a/c4/nursery.c
+++ b/c4/nursery.c
@@ -155,6 +155,48 @@
d->num_private_from_protected_known_old = size;
}
+static void trace_stub(struct tx_descriptor *d, gcptr S)
+{
+ revision_t w = ACCESS_ONCE(S->h_revision);
+ if ((w & 3) != 2) {
+ /* P has a ptr in h_revision, but this object is not a stub
+ with a protected pointer. It has likely been the case
+ in the past, but someone made even more changes.
+ Nothing to do now.
+ */
+ fprintf(stderr, "trace_stub: %p not a stub, ignored\n", S);
+ return;
+ }
+
+ assert(S->h_tid & GCFLAG_STUB);
+ if (STUB_THREAD(S) != d->public_descriptor) {
+ /* Bah, it's indeed a stub but for another thread. Nothing
+ to do now.
+ */
+ fprintf(stderr, "trace_stub: %p stub wrong thread, ignored\n", S);
+ return;
+ }
+
+ /* It's a stub for us. It cannot be un-stubbed under our
+ feet because we hold our own collection_lock.
+ */
+ gcptr L = (gcptr)(w - 2);
+ fprintf(stderr, "trace_stub: %p stub -> %p\n", S, L);
+ visit_if_young(&L);
+ S->h_revision = ((revision_t)L) | 2;
+}
+
+static void mark_stolen_young_stubs(struct tx_descriptor *d)
+{
+ long i, size = d->public_descriptor->stolen_young_stubs.size;
+ gcptr *items = d->public_descriptor->stolen_young_stubs.items;
+
+ for (i = 0; i < size; i++) {
+ trace_stub(d, items[i]);
+ }
+ gcptrlist_clear(&d->public_descriptor->stolen_young_stubs);
+}
+
static void mark_public_to_young(struct tx_descriptor *d)
{
/* "public_with_young_copy" lists the public copies that may have
@@ -207,37 +249,8 @@
continue;
}
- gcptr S = (gcptr)v;
- revision_t w = ACCESS_ONCE(S->h_revision);
- if ((w & 3) != 2) {
- /* P has a ptr in h_revision, but this object is not a stub
- with a protected pointer. It has likely been the case
- in the past, but someone made even more changes.
- Nothing to do now.
- */
- fprintf(stderr, "public_to_young: %p -> %p not a stub, ignored\n",
- P, S);
- continue;
- }
-
- if (STUB_THREAD(S) != d->public_descriptor) {
- /* Bah, it's indeed a stub but for another thread. Nothing
- to do now.
- */
- fprintf(stderr, "public_to_young: %p -> %p stub wrong thread, "
- "ignored\n", P, S);
- continue;
- }
-
- /* It's a stub for us. It cannot be un-stubbed under our
- feet because we hold our own collection_lock.
- */
- gcptr L = (gcptr)(w - 2);
- fprintf(stderr, "public_to_young: %p -> %p stub -> %p\n",
- P, S, L);
-
- visit_if_young(&L);
- S->h_revision = ((revision_t)L) | 2;
+ fprintf(stderr, "public_to_young: %p -> ", P);
+ trace_stub(d, (gcptr)v);
}
gcptrlist_clear(&d->public_with_young_copy);
@@ -286,6 +299,8 @@
mark_young_roots(d);
+ mark_stolen_young_stubs(d);
+
mark_private_from_protected(d);
visit_all_outside_objects(d);
@@ -309,6 +324,8 @@
d->nursery_base = stm_malloc(GC_NURSERY);
memset(d->nursery_base, 0, GC_NURSERY);
d->nursery_end = d->nursery_base + GC_NURSERY;
+ fprintf(stderr, "minor: nursery moved to [%p to %p]\n", d->nursery_base,
+ d->nursery_end);
#else
memset(d->nursery_base, 0, GC_NURSERY);
#endif
diff --git a/c4/steal.c b/c4/steal.c
--- a/c4/steal.c
+++ b/c4/steal.c
@@ -79,6 +79,9 @@
stub->h_revision = ((revision_t)obj) | 2;
g2l_insert(&sd->all_stubs, obj, stub);
+ if (!(obj->h_tid & GCFLAG_OLD))
+ gcptrlist_insert(&sd->foreign_pd->stolen_young_stubs, stub);
+
done:
*pobj = stub;
fprintf(stderr, " stolen: fixing *%p: %p -> %p\n", pobj, obj, stub);
@@ -116,15 +119,14 @@
L = B;
goto already_stolen;
}
- else {
- B->h_tid |= GCFLAG_PUBLIC_TO_PRIVATE;
- /* add {B: L} in 'public_to_private', but lazily, because we
- don't want to walk over the feet of the foreign thread
- */
- gcptrlist_insert2(&foreign_pd->stolen_objects, B, L);
- fprintf(stderr, "stolen: %p -> %p <-> %p\n", P, L, B);
- L = B;
- }
+
+ B->h_tid |= GCFLAG_PUBLIC_TO_PRIVATE;
+ /* add {B: L} in 'public_to_private', but lazily, because we
+ don't want to walk over the feet of the foreign thread
+ */
+ gcptrlist_insert2(&foreign_pd->stolen_objects, B, L);
+ fprintf(stderr, "stolen: %p -> %p <-> %p\n", P, L, B);
+ L = B;
}
else {
if (L->h_tid & GCFLAG_PUBLIC) {
@@ -140,9 +142,8 @@
L = (gcptr)v;
goto already_stolen;
}
- else {
- fprintf(stderr, "stolen: %p -> %p\n", P, L);
- }
+
+ fprintf(stderr, "stolen: %p -> %p\n", P, L);
/* Copy the object out of the other thread's nursery, if needed */
if (!(L->h_tid & GCFLAG_OLD)) {
@@ -151,6 +152,7 @@
L->h_tid |= GCFLAG_PUBLIC | GCFLAG_NURSERY_MOVED;
L = O;
}
+ assert(L->h_tid & GCFLAG_OLD);
}
/* Here L is a protected (or backup) copy, and we own the foreign
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit