Author: Armin Rigo <[email protected]>
Branch:
Changeset: r151:502b592672e6
Date: 2013-06-16 16:58 +0200
http://bitbucket.org/pypy/stmgc/changeset/502b592672e6/
Log: Bug fix (GCFLAG_PUBLIC -> GCFLAG_OLD, in the middle of debugging
prints)
diff --git a/c4/et.c b/c4/et.c
--- a/c4/et.c
+++ b/c4/et.c
@@ -283,6 +283,23 @@
return NULL;
}
+static void _check_flags(gcptr P)
+{
+ struct tx_descriptor *d = thread_descriptor;
+ int is_old = (P->h_tid & GCFLAG_OLD) != 0;
+ int in_nurs = (d->nursery_base <= (char*)P && ((char*)P) < d->nursery_end);
+ if (in_nurs)
+ {
+ assert(!is_old);
+ fprintf(stderr, "Y ");
+ }
+ else
+ {
+ assert(is_old);
+ fprintf(stderr, "O ");
+ }
+}
+
gcptr _stm_nonrecord_barrier(gcptr P)
{
/* follows the logic in stm_DirectReadBarrier() */
@@ -290,6 +307,7 @@
revision_t v;
fprintf(stderr, "_stm_nonrecord_barrier: %p ", P);
+ _check_flags(P);
restart_all:
if (P->h_revision == stm_private_rev_num)
@@ -313,6 +331,9 @@
while (v = P->h_revision, IS_POINTER(v))
{
+ if (P->h_tid & GCFLAG_NURSERY_MOVED)
+ fprintf(stderr, "nursery_moved ");
+
if (v & 2)
{
fprintf(stderr, "stub ");
@@ -323,6 +344,7 @@
}
P = (gcptr)v;
+ _check_flags(P);
assert(P->h_tid & GCFLAG_PUBLIC);
fprintf(stderr, "-> %p public ", P);
}
@@ -348,15 +370,18 @@
if (STUB_THREAD(P) == d->public_descriptor)
{
P = (gcptr)(v - 2);
+ _check_flags(P);
fprintf(stderr, "-> %p ", P);
}
else
{
P = (gcptr)(v - 2);
+ /* cannot _check_flags(P): foreign! */
fprintf(stderr, "-foreign-> %p ", P);
if (P->h_tid & GCFLAG_PRIVATE_FROM_PROTECTED)
{
P = (gcptr)P->h_revision; /* the backup copy */
+ /* cannot _check_flags(P): foreign! */
fprintf(stderr, "-backup-> %p ", P);
}
if (!(P->h_tid & GCFLAG_PUBLIC))
@@ -365,6 +390,7 @@
return (gcptr)-1;
}
}
+ /* cannot _check_flags(P): foreign! */
goto restart_all;
}
@@ -409,7 +435,7 @@
P->h_revision = (revision_t)B;
gcptrlist_insert(&d->private_from_protected, P);
- fprintf(stderr, "private_from_protected: insert %p\n", P);
+ fprintf(stderr, "private_from_protected: insert %p (backup %p)\n", P, B);
return P; /* always returns its arg: the object is converted in-place */
}
@@ -1006,6 +1032,7 @@
else
{
stm_free(B, stmcb_size(B));
+ fprintf(stderr, "commit: free backup at %p\n", B);
}
};
gcptrlist_clear(&d->private_from_protected);
@@ -1052,6 +1079,7 @@
size - offsetof(struct stm_object_s, h_revision));
assert(!(P->h_tid & GCFLAG_BACKUP_COPY));
stm_free(B, size);
+ fprintf(stderr, "abort: free backup at %p\n", B);
}
};
gcptrlist_clear(&d->private_from_protected);
diff --git a/c4/nursery.c b/c4/nursery.c
--- a/c4/nursery.c
+++ b/c4/nursery.c
@@ -17,6 +17,9 @@
memset(d->nursery_base, 0, GC_NURSERY);
d->nursery_end = d->nursery_base + GC_NURSERY;
d->nursery_current = d->nursery_base;
+
+ fprintf(stderr, "minor: nursery is at [%p to %p]\n", d->nursery_base,
+ d->nursery_end);
}
void stmgc_done_nursery(void)
diff --git a/c4/steal.c b/c4/steal.c
--- a/c4/steal.c
+++ b/c4/steal.c
@@ -55,7 +55,8 @@
static void replace_ptr_to_protected_with_stub(gcptr *pobj)
{
gcptr stub, obj = *pobj;
- if (obj == NULL || (obj->h_tid & GCFLAG_PUBLIC) != 0)
+ if (obj == NULL || (obj->h_tid & (GCFLAG_PUBLIC | GCFLAG_OLD)) ==
+ (GCFLAG_PUBLIC | GCFLAG_OLD))
return;
/* we use 'all_stubs', a dictionary, in order to try to avoid
@@ -138,8 +139,10 @@
has GCFLAG_NURSERY_MOVED), but it is fine to do it more
generally. */
v = ACCESS_ONCE(L->h_revision);
- if (IS_POINTER(v))
+ if (IS_POINTER(v)) {
L = (gcptr)v;
+ fprintf(stderr, "\t---> %p\n", L);
+ }
goto already_stolen;
}
@@ -151,6 +154,7 @@
L->h_revision = (revision_t)O;
L->h_tid |= GCFLAG_PUBLIC | GCFLAG_NURSERY_MOVED;
L = O;
+ fprintf(stderr, "\t---> %p\n", L);
}
assert(L->h_tid & GCFLAG_OLD);
}
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit