[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