Author: Armin Rigo <ar...@tunes.org> Branch: stm-thread-2 Changeset: r61598:62ed6ba35d69 Date: 2013-02-22 12:43 +0100 http://bitbucket.org/pypy/pypy/changeset/62ed6ba35d69/
Log: Test and fix diff --git a/rpython/translator/stm/src_stm/rpyintf.c b/rpython/translator/stm/src_stm/rpyintf.c --- a/rpython/translator/stm/src_stm/rpyintf.c +++ b/rpython/translator/stm/src_stm/rpyintf.c @@ -198,15 +198,20 @@ void stm_abort_info_push(void *obj, void *fieldoffsets) { - struct tx_descriptor *d = thread_descriptor; - gcptrlist_insert2(&d->abortinfo, (gcptr)obj, (gcptr)fieldoffsets); + struct tx_descriptor *d = thread_descriptor; + gcptr P = (gcptr)obj; + if ((P->h_tid & GCFLAG_GLOBAL) && + (P->h_tid & GCFLAG_POSSIBLY_OUTDATED)) { + P = LatestGlobalRevision(d, P, NULL, 0); + } + gcptrlist_insert2(&d->abortinfo, P, (gcptr)fieldoffsets); } void stm_abort_info_pop(long count) { - struct tx_descriptor *d = thread_descriptor; - long newsize = d->abortinfo.size - 2 * count; - gcptrlist_reduce_size(&d->abortinfo, newsize < 0 ? 0 : newsize); + struct tx_descriptor *d = thread_descriptor; + long newsize = d->abortinfo.size - 2 * count; + gcptrlist_reduce_size(&d->abortinfo, newsize < 0 ? 0 : newsize); } size_t _stm_decode_abort_info(struct tx_descriptor *d, char *output) @@ -224,7 +229,7 @@ } WRITE('l'); for (i=0; i<d->abortinfo.size; i+=2) { - char *object = (char*)d->abortinfo.items[i+0]; + char *object = (char *)stm_RepeatReadBarrier(d->abortinfo.items[i+0]); long *fieldoffsets = (long*)d->abortinfo.items[i+1]; long kind, offset; char buffer[32]; @@ -258,10 +263,15 @@ break; case 3: /* pointer to STR */ rps = *(RPyString **)(object + offset); - rps_size = RPyString_Size(rps); - res_size = sprintf(buffer, "%zu:", rps_size); - WRITE_BUF(buffer, res_size); - WRITE_BUF(_RPyString_AsString(rps), rps_size); + if (rps) { + rps_size = RPyString_Size(rps); + res_size = sprintf(buffer, "%zu:", rps_size); + WRITE_BUF(buffer, res_size); + WRITE_BUF(_RPyString_AsString(rps), rps_size); + } + else { + WRITE_BUF("0:", 2); + } break; default: fprintf(stderr, "Fatal RPython error: corrupted abort log\n"); diff --git a/rpython/translator/stm/test/test_ztranslated.py b/rpython/translator/stm/test/test_ztranslated.py --- a/rpython/translator/stm/test/test_ztranslated.py +++ b/rpython/translator/stm/test/test_ztranslated.py @@ -138,9 +138,13 @@ pass globf = Foobar() + def setxy(globf, retry_counter): + if retry_counter > 1: + globf.xy = 100 + retry_counter + def check(_, retry_counter): - globf.xy = 100 + retry_counter rstm.abort_info_push(globf, ('xy', '[', 'yx', ']')) + setxy(globf, retry_counter) if retry_counter < 3: rstm.abort_and_retry() # _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit