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