[pypy-commit] stmgc c7-refactor: Fix: found out how we are really supposed to get fresh zero-mapped pages
arigo
noreply at buildbot.pypy.org
Fri Feb 21 09:25:03 CET 2014
Author: Armin Rigo <arigo at tunes.org>
Branch: c7-refactor
Changeset: r802:31fcb790a36e
Date: 2014-02-21 09:24 +0100
http://bitbucket.org/pypy/stmgc/changeset/31fcb790a36e/
Log: Fix: found out how we are really supposed to get fresh zero-mapped
pages in an mmap. The answer is simply to call mmap(MAP_FIXED)
again.
diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -93,10 +93,16 @@
*/
char *readmarkers = REAL_ADDRESS(STM_SEGMENT->segment_base,
FIRST_READMARKER_PAGE * 4096UL);
- if (madvise(readmarkers, NB_READMARKER_PAGES * 4096UL,
- MADV_DONTNEED) < 0) {
- perror("madvise");
+ dprintf(("reset_transaction_read_version: %p %ld\n", readmarkers,
+ (long)(NB_READMARKER_PAGES * 4096UL)));
+ if (mmap(readmarkers, NB_READMARKER_PAGES * 4096UL,
+ PROT_READ | PROT_WRITE,
+ MAP_FIXED | MAP_PAGES_FLAGS, -1, 0) != readmarkers) {
+ /* fall-back */
+#if STM_TESTS
abort();
+#endif
+ memset(readmarkers, 0, NB_READMARKER_PAGES * 4096UL);
}
reset_transaction_read_version_prebuilt();
STM_SEGMENT->transaction_read_version = 1;
diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -144,6 +144,10 @@
*/
static inline void stm_read(object_t *obj)
{
+#if 0 /* very costly check */
+ assert(((stm_read_marker_t *)(((uintptr_t)obj) >> 4))->rm
+ <= STM_SEGMENT->transaction_read_version);
+#endif
((stm_read_marker_t *)(((uintptr_t)obj) >> 4))->rm =
STM_SEGMENT->transaction_read_version;
}
More information about the pypy-commit
mailing list