Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r122:03a8ca843df4
Date: 2013-06-13 23:20 +0200
http://bitbucket.org/pypy/stmgc/changeset/03a8ca843df4/

Log:    Next test

diff --git a/c4/dbgmem.c b/c4/dbgmem.c
--- a/c4/dbgmem.c
+++ b/c4/dbgmem.c
@@ -9,7 +9,8 @@
 #define MMAP_TOTAL  671088640   /* 640MB */
 
 static pthread_mutex_t malloc_mutex = PTHREAD_MUTEX_INITIALIZER;
-static char *zone_current = NULL, *zone_end = NULL;
+static char *zone_start, *zone_current = NULL, *zone_end = NULL;
+static signed char accessible_pages[MMAP_TOTAL / PAGE_SIZE] = {0};
 
 
 static void _stm_dbgmem(void *p, size_t sz, int prot)
@@ -30,15 +31,16 @@
     pthread_mutex_lock(&malloc_mutex);
 
     if (zone_current == NULL) {
-        zone_current = mmap(NULL, MMAP_TOTAL, PROT_NONE,
-                            MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-        if (zone_current == NULL || zone_current == MAP_FAILED) {
+        zone_start = mmap(NULL, MMAP_TOTAL, PROT_NONE,
+                          MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+        if (zone_start == NULL || zone_start == MAP_FAILED) {
             fprintf(stderr, "not enough memory: mmap() failed\n");
             abort();
         }
-        zone_end = zone_current + MMAP_TOTAL;
+        zone_current = zone_start;
+        zone_end = zone_start + MMAP_TOTAL;
         assert((MMAP_TOTAL % PAGE_SIZE) == 0);
-        _stm_dbgmem(zone_current, MMAP_TOTAL, PROT_NONE);
+        _stm_dbgmem(zone_start, MMAP_TOTAL, PROT_NONE);
     }
 
     size_t nb_pages = (sz + PAGE_SIZE - 1) / PAGE_SIZE + 1;
@@ -54,14 +56,33 @@
     result += (-sz) & (PAGE_SIZE-1);
     assert(((intptr_t)(result + sz) & (PAGE_SIZE-1)) == 0);
     _stm_dbgmem(result, sz, PROT_READ | PROT_WRITE);
+
+    long i, base = (result - zone_start) / PAGE_SIZE;
+    for (i = 0; i < nb_pages; i++)
+        accessible_pages[base + i] = 42;
+
     return result;
 }
 
 void stm_free(void *p, size_t sz)
 {
+    size_t nb_pages = (sz + PAGE_SIZE - 1) / PAGE_SIZE + 1;
+    long i, base = ((char *)p - zone_start) / PAGE_SIZE;
+    assert(0 <= base && base < (MMAP_TOTAL / PAGE_SIZE));
+    for (i = 0; i < nb_pages; i++) {
+        assert(accessible_pages[base + i] == 42);
+        accessible_pages[base + i] = -1;
+    }
     memset(p, 0xDD, sz);
     _stm_dbgmem(p, sz, PROT_NONE);
 }
 
+int _stm_can_access_memory(char *p)
+{
+    long base = ((char *)p - zone_start) / PAGE_SIZE;
+    assert(0 <= base && base < (MMAP_TOTAL / PAGE_SIZE));
+    return accessible_pages[base] == 42;
+}
+
 /************************************************************/
 #endif
diff --git a/c4/dbgmem.h b/c4/dbgmem.h
--- a/c4/dbgmem.h
+++ b/c4/dbgmem.h
@@ -6,6 +6,7 @@
 
 void *stm_malloc(size_t);
 void stm_free(void *, size_t);
+int _stm_can_access_memory(char *);
 
 #else
 
diff --git a/c4/test/support.py b/c4/test/support.py
--- a/c4/test/support.py
+++ b/c4/test/support.py
@@ -87,8 +87,7 @@
     revision_t get_start_time(void);
     void *my_stub_thread(void);
 
-    //gcptr *addr_of_thread_local(void);
-    //int in_nursery(gcptr);
+    int _stm_can_access_memory(char *);
     void stm_initialize_tests(int max_aborts);
 
     /* some constants normally private that are useful in the tests */
@@ -449,6 +448,9 @@
 def check_nursery_free(p):
     assert p.h_tid == p.h_revision == 0
 
+def check_inaccessible(p):
+    assert not lib._stm_can_access_memory(p)
+
 def check_prebuilt(p):
     assert 42 < (p.h_tid & 0xFFFF) < 521
     assert p.h_tid & GCFLAG_PREBUILT_ORIGINAL
diff --git a/c4/test/test_nursery.py b/c4/test/test_nursery.py
--- a/c4/test/test_nursery.py
+++ b/c4/test/test_nursery.py
@@ -43,3 +43,9 @@
     p1b = lib.stm_pop_root()
     p2b = rawgetptr(p1b, 0)
     assert rawgetptr(p2b, 0) == ffi.NULL
+
+def test_free_nursery_at_thread_end():
+    p1 = nalloc(HDR)
+    lib.stm_finalize()
+    check_inaccessible(p1)
+    lib.stm_initialize_tests(0)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to