Author: Remi Meier <[email protected]>
Branch:
Changeset: r399:6d83a39b28cf
Date: 2013-07-15 17:16 +0200
http://bitbucket.org/pypy/stmgc/changeset/6d83a39b28cf/
Log: fix one bug and use a "big stub" in case it is also needed as the
h_original of an object
diff --git a/c4/demo_random.c b/c4/demo_random.c
--- a/c4/demo_random.c
+++ b/c4/demo_random.c
@@ -75,7 +75,7 @@
// helper functions
int classify(gcptr p);
void check(gcptr p);
-
+int in_nursery(gcptr obj);
static int is_private(gcptr P)
{
return (P->h_revision == stm_private_rev_num) ||
@@ -226,8 +226,7 @@
if (p->h_original && !(p->h_tid & GCFLAG_PREBUILT_ORIGINAL)) {
// must point to valid old object
gcptr id = (gcptr)p->h_original;
- assert(id->h_tid & GCFLAG_OLD);
- check_not_free(id);
+ assert(!in_nursery(id));
#ifdef _GC_DEBUG
if (!is_shared_prebuilt(id) && !(id->h_tid & GCFLAG_PREBUILT))
assert(!is_free_old(id));
diff --git a/c4/extra.c b/c4/extra.c
--- a/c4/extra.c
+++ b/c4/extra.c
@@ -107,10 +107,12 @@
else {
/* must create shadow original object XXX: or use
backup, if exists */
-
- /* XXX use stmgcpage_malloc() directly, we don't need to copy
- * the contents yet */
- gcptr O = stmgc_duplicate_old(p);
+ gcptr O = (gcptr)stmgcpage_malloc(stmgc_size(p));
+ memcpy(O, p, stmgc_size(p)); /* at least major collections
+ depend on some content of id_copy.
+ remove after fixing that XXX */
+ O->h_tid |= GCFLAG_OLD;
+
p->h_original = (revision_t)O;
p->h_tid |= GCFLAG_HAS_ID;
diff --git a/c4/steal.c b/c4/steal.c
--- a/c4/steal.c
+++ b/c4/steal.c
@@ -39,7 +39,21 @@
goto done;
not_found:
- stub = stm_stub_malloc(sd->foreign_pd);
+ if (!obj->h_original && !(obj->h_tid & GCFLAG_OLD)) {
+ /* There shouldn't be a public, young object without
+ a h_original. But there can be priv/protected ones.
+ We have a young protected copy without an h_original
+ The stub we allocate will be the h_original, but
+ it must be big enough to be copied over by a major
+ collection later. */
+ assert(!(obj->h_tid & GCFLAG_PUBLIC));
+
+ stub = (gcptr)stmgcpage_malloc(stmgc_size(obj));
+ STUB_THREAD(stub) = sd->foreign_pd;
+ }
+ else {
+ stub = stm_stub_malloc(sd->foreign_pd);
+ }
stub->h_tid = (obj->h_tid & STM_USER_TID_MASK) | GCFLAG_PUBLIC
| GCFLAG_STUB
| GCFLAG_OLD;
@@ -51,10 +65,9 @@
stub->h_original = (revision_t)obj;
}
else {
- /* There shouldn't be a public, young object without
- a h_original. But there can be protected ones. */
- assert(!(obj->h_tid & GCFLAG_PUBLIC));
- obj->h_original = (revision_t)stub;
+ /* this is the big-stub case described above */
+ obj->h_original = (revision_t)stub;
+ stub->h_original = 0; /* stub_malloc does not set to 0... */
if (obj->h_tid & GCFLAG_PRIVATE_FROM_PROTECTED) {
((gcptr)obj->h_revision)->h_original = (revision_t)stub;
}
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit