From 499cb894e4d95e8f7090ff7603d2c750c48223ef Mon Sep 17 00:00:00 2001 From: jjenista Date: Thu, 28 Oct 2010 01:01:24 +0000 Subject: [PATCH] even though man page says otherwise, addr and len to mprotect must be page-aligned and page multiple --- .../Benchmarks/oooJava/micro-master-makefile | 2 +- .../src/Benchmarks/oooJava/micro4/test.java | 6 ++- Robust/src/Runtime/memPool.h | 37 +++++++++++++++++-- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/Robust/src/Benchmarks/oooJava/micro-master-makefile b/Robust/src/Benchmarks/oooJava/micro-master-makefile index 0107d28d..ad180512 100644 --- a/Robust/src/Benchmarks/oooJava/micro-master-makefile +++ b/Robust/src/Benchmarks/oooJava/micro-master-makefile @@ -32,7 +32,7 @@ USECOREPROF= #-coreprof $(COREPROFOVERFLOW) \ -coreprof-enable cpe_taskstallmem -USEOOO= -ooojava 24 2 -squeue -mempool-detect-misuse #-ooodebug-disable-task-mem-pool #-ooodebug +USEOOO= -ooojava 12 2 -squeue -mempool-detect-misuse #-ooodebug-disable-task-mem-pool #-ooodebug BSFLAGS= -64bit -mainclass $(PROGRAM) -heapsize-mb 50 -garbagestats -joptimize -noloop -debug -debug-deque # -optimize src-after-pp DRELEASEMODE=-disjoint-release-mode -disjoint-dvisit-stack-callees-on-top -disjoint-alias-file aliases.txt tabbed diff --git a/Robust/src/Benchmarks/oooJava/micro4/test.java b/Robust/src/Benchmarks/oooJava/micro4/test.java index 5465abe4..d6faa9fd 100644 --- a/Robust/src/Benchmarks/oooJava/micro4/test.java +++ b/Robust/src/Benchmarks/oooJava/micro4/test.java @@ -8,8 +8,10 @@ public class test { public static void main( String argv[] ) { - long count = 500; - int numFoo = 1000; + //long count = 500; + //int numFoo = 1000; + long count = 80; + int numFoo = 10; if( argv.length > 0 ) { count = count * Integer.parseInt( argv[0] ); diff --git a/Robust/src/Runtime/memPool.h b/Robust/src/Runtime/memPool.h index 8724b191..0662e5fc 100644 --- a/Robust/src/Runtime/memPool.h +++ b/Robust/src/Runtime/memPool.h @@ -53,6 +53,7 @@ typedef struct MemPool_t { #ifdef MEMPOOL_DETECT_MISUSE int allocSize; + int protectSize; #else //normal version MemPoolItem* head; @@ -83,11 +84,18 @@ static MemPool* poolcreate( int itemSize, if( itemSize % pageSize == 0 ) { // if the item size is already an exact multiple - // of the page size, just increase by one page + // of the page size, just increase alloc by one page p->allocSize = itemSize + pageSize; + + // and size for mprotect should be exact page multiple + p->protectSize = itemSize; } else { // otherwise, round down to a page size, then add two p->allocSize = (itemSize & ~(pageSize-1)) + 2*pageSize; + + // and size for mprotect should be exact page multiple + // so round down, add one + p->protectSize = (itemSize & ~(pageSize-1)) + pageSize; } #else @@ -113,8 +121,18 @@ static inline void poolfreeinto( MemPool* p, void* ptr ) { // don't actually return memory to the pool, just lock // it up tight so first code to touch it badly gets caught // also, mprotect automatically protects full pages - if( mprotect( ptr, p->itemSize, PROT_NONE ) != 0 ) { - printf( "mprotect failed, %s.\n", strerror( errno ) ); + if( mprotect( ptr, p->protectSize, PROT_NONE ) != 0 ) { + + switch( errno ) { + + case ENOMEM: { + printf( "mprotect failed, ENOMEM.\n" ); + } break; + + default: + printf( "mprotect failed, errno=%d.\n", errno ); + } + exit( -1 ); } } @@ -166,6 +184,19 @@ static inline void* poolalloc( MemPool* p ) { void* newRec = (void*)((nonAligned + pageSize-1) & ~(pageSize-1)); + //printf( "PageSize is %d or 0x%x.\n", (INTPTR)pageSize, (INTPTR)pageSize ); + //printf( "itemSize is 0x%x and allocSize is 0x%x.\n", (INTPTR)p->itemSize, (INTPTR)p->allocSize ); + //printf( "Allocation returned 0x%x to 0x%x,\n", (INTPTR)nonAligned, (INTPTR)nonAligned + (INTPTR)(p->allocSize) ); + //printf( "Intend to use 0x%x to 0x%x,\n\n", (INTPTR)newRec, (INTPTR)newRec + (INTPTR)(p->itemSize) ); + + // intentionally touch the top of the new, aligned record in terms of the + // pages that will be locked when it eventually is free'd + INTPTR topOfRec = (INTPTR)newRec; + topOfRec += p->protectSize - 1; + ((char*)topOfRec)[0] = 0x1; + + + if( p->initFreshlyAllocated != NULL ) { p->initFreshlyAllocated( newRec ); } -- 2.34.1