Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r265:b2b7620a4429 Date: 2013-06-24 17:05 +0200 http://bitbucket.org/pypy/stmgc/changeset/b2b7620a4429/
Log: merge heads diff --git a/c4/demo_random.c b/c4/demo_random.c --- a/c4/demo_random.c +++ b/c4/demo_random.c @@ -29,6 +29,7 @@ struct stm_object_s hdr; long value; revision_t id; + revision_t hash; struct node *next; }; typedef struct node * nodeptr; @@ -84,7 +85,14 @@ gcptr x = calloc(1, size); x->h_tid = PREBUILT_FLAGS | tid; x->h_revision = PREBUILT_REVISION; - x->h_original = 0; + return x; +} + +gcptr allocate_pseudoprebuilt_with_hash(size_t size, int tid, + revision_t hash) +{ + gcptr x = allocate_pseudoprebuilt(size, tid); + x->h_original = hash; return x; } @@ -240,8 +248,17 @@ td.num_roots = PREBUILT + NUMROOTS; for (i = 0; i < PREBUILT; i++) { - td.roots[i] = allocate_pseudoprebuilt(sizeof(struct node), - GCTID_STRUCT_NODE); + if (i % 3 == 0) { + td.roots[i] = allocate_pseudoprebuilt_with_hash( + sizeof(struct node), + GCTID_STRUCT_NODE, + i); + ((nodeptr)td.roots[i])->hash = i; + } + else { + td.roots[i] = allocate_pseudoprebuilt(sizeof(struct node), + GCTID_STRUCT_NODE); + } } for (i = PREBUILT; i < PREBUILT + NUMROOTS; i++) { td.roots[i] = (gcptr)allocate_node(); @@ -251,17 +268,19 @@ gcptr do_step(gcptr p) { - nodeptr w_r, w_sr; - gcptr _r, _sr; + nodeptr w_r, w_sr, w_t; + gcptr _r, _sr, _t; int num, k; + _t = NULL; num = get_rand(td.num_roots); _r = td.roots[num]; - + num = get_rand(SHARED_ROOTS); _sr = shared_roots[num]; - k = get_rand(17); + k = get_rand(19); + check(p); switch (k) { case 0: // remove a root @@ -323,28 +342,42 @@ pop_roots(); p = NULL; break; - case 15: /* test stm_id on non-shared roots */ - w_r = (nodeptr)read_barrier(_r); - if (w_r->id) { - assert(w_r->id == stm_id((gcptr)w_r)); - assert(w_r->id == stm_id((gcptr)_r)); + case 15: /* test stm_id on (non-)shared roots */ + _t = _r; + case 16: + if (!_t) + _t = _sr; + w_t = (nodeptr)read_barrier(_t); + if (w_t->id) { + assert(w_t->id == stm_id((gcptr)w_t)); + assert(w_t->id == stm_id((gcptr)_t)); } else { - w_r = (nodeptr)write_barrier(_r); - w_r->id = stm_id((gcptr)w_r); - assert(w_r->id == stm_id((gcptr)_r)); + w_t = (nodeptr)write_barrier(_t); + w_t->id = stm_id((gcptr)w_t); + assert(w_t->id == stm_id((gcptr)_t)); } - case 16: /* test stm_id on shared roots */ - w_sr = (nodeptr)read_barrier(_sr); - if (w_sr->id) { - assert(w_sr->id == stm_id((gcptr)w_sr)); - assert(w_sr->id == stm_id((gcptr)_sr)); - } + break; + case 17: /* test stm_hash on (non-)shared roots */ + _t = _r; + case 18: + if (!_t) + _t = _sr; + w_t = (nodeptr)read_barrier(_t); + if (w_t->hash) { + assert(w_t->hash == stm_hash((gcptr)w_t)); + assert(w_t->hash == stm_hash((gcptr)_t)); + } else { - w_sr = (nodeptr)write_barrier(_sr); - w_sr->id = stm_id((gcptr)w_sr); - assert(w_sr->id == stm_id((gcptr)_sr)); + w_t = (nodeptr)write_barrier(_t); + w_t->hash = stm_hash((gcptr)w_t); + assert(w_t->hash == stm_hash((gcptr)_t)); } + if (w_t->hash < PREBUILT || w_t->hash < SHARED_ROOTS) { + // should be with predefined hash + assert (stm_id((gcptr)w_t) != stm_hash((gcptr)w_t)); + } + break; } return p; } @@ -449,8 +482,17 @@ default_seed = time(NULL) / 3600 / 24; for (i = 0; i < SHARED_ROOTS; i++) { - shared_roots[i] = allocate_pseudoprebuilt(sizeof(struct node), - GCTID_STRUCT_NODE); + if (i % 3 == 0) { + shared_roots[i] = allocate_pseudoprebuilt_with_hash( + sizeof(struct node), + GCTID_STRUCT_NODE, + i); + ((nodeptr)shared_roots[i])->hash = i; + } + else { + shared_roots[i] = allocate_pseudoprebuilt(sizeof(struct node), + GCTID_STRUCT_NODE); + } } status = sem_init(&done, 0, 0); _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit