Author: Armin Rigo <[email protected]>
Branch:
Changeset: r331:452c22b17f3e
Date: 2013-07-01 12:52 +0200
http://bitbucket.org/pypy/stmgc/changeset/452c22b17f3e/
Log: Fix(?) the logic, I believe, and remove the recursion; but
demo_random crashes. To investigate.
diff --git a/c4/gcpage.c b/c4/gcpage.c
--- a/c4/gcpage.c
+++ b/c4/gcpage.c
@@ -230,6 +230,10 @@
if (obj->h_revision & 1) {
assert(!(obj->h_tid & GCFLAG_PRIVATE_FROM_PROTECTED));
obj->h_tid &= ~GCFLAG_PUBLIC_TO_PRIVATE; /* see also fix_outdated() */
+
+ obj->h_tid |= GCFLAG_VISITED;
+ assert(!(obj->h_tid & GCFLAG_STUB));
+ gcptrlist_insert(&objects_to_trace, obj);
}
else if (obj->h_tid & GCFLAG_PUBLIC) {
/* h_revision is a ptr: we have a more recent version */
@@ -269,26 +273,24 @@
else {
assert(obj->h_tid & GCFLAG_PRIVATE_FROM_PROTECTED);
gcptr B = (gcptr)obj->h_revision;
+ assert(B->h_tid & (GCFLAG_PUBLIC | GCFLAG_BACKUP_COPY));
+
+ obj->h_tid |= GCFLAG_VISITED;
+ B->h_tid |= GCFLAG_VISITED;
+ assert(!(obj->h_tid & GCFLAG_STUB));
assert(!(B->h_tid & GCFLAG_STUB));
- gcptrlist_insert(&objects_to_trace, B);
+ gcptrlist_insert2(&objects_to_trace, obj, B);
- if (!(B->h_tid & GCFLAG_PUBLIC)) {
- /* a regular private_from_protected object with a backup copy B */
- assert(B->h_tid & GCFLAG_BACKUP_COPY);
- assert(B->h_revision & 1);
- B->h_tid |= GCFLAG_VISITED;
- }
- else {
- /* a private_from_protected with a stolen backup copy B */
+ if (IS_POINTER(B->h_revision)) {
+ assert(B->h_tid & GCFLAG_PUBLIC);
assert(!(B->h_tid & GCFLAG_BACKUP_COPY));
- gcptr obj1 = B;
- visit(&obj1); /* xxx recursion? */
- obj->h_revision = (revision_t)obj1;
+ assert(!(B->h_revision & 2));
+
+ pobj = (gcptr *)&B->h_revision;
+ obj = *pobj;
+ goto restart;
}
}
- obj->h_tid |= GCFLAG_VISITED;
- assert(!(obj->h_tid & GCFLAG_STUB));
- gcptrlist_insert(&objects_to_trace, obj);
}
static void visit_all_objects(void)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit