Author: Remi Meier <remi.me...@inf.ethz.ch> Branch: Changeset: r1235:6c47b2117314 Date: 2014-05-22 16:53 +0200 http://bitbucket.org/pypy/stmgc/changeset/6c47b2117314/
Log: complete fix for last commit diff --git a/c7/stm/gcpage.c b/c7/stm/gcpage.c --- a/c7/stm/gcpage.c +++ b/c7/stm/gcpage.c @@ -482,7 +482,22 @@ static inline bool largemalloc_keep_object_at(char *data) { /* this is called by _stm_largemalloc_sweep() */ - return mark_visited_test_and_clear((object_t *)(data - stm_object_pages)); + object_t *obj = (object_t *)(data - stm_object_pages); + if (!mark_visited_test_and_clear(obj)) { +#ifndef NDEBUG + /* This is actually needed in order to avoid random write-read + conflicts with objects read and freed long in the past. Still, + it is probably rare enough so that we don't need this additional + overhead. (test_random hits it sometimes) */ + long i; + for (i = 1; i <= NB_SEGMENTS; i++) { + ((struct stm_read_marker_s *) + (get_segment_base(i) + (((uintptr_t)obj) >> 4)))->rm = 0; + } +#endif + return false; + } + return true; } static void sweep_large_objects(void) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit