X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fbigalloc.c;h=3749fc9c89cdf331f591a5a3247da44696475fce;hb=da2f99caf76902aacb06fd389994ac79182a92da;hp=e2be03a227de42c95e21bed5b59b19dbe397bf99;hpb=3b2012287b1980f81b43eb811dd3ffd79d565715;p=libucw.git diff --git a/lib/bigalloc.c b/lib/bigalloc.c index e2be03a2..3749fc9c 100644 --- a/lib/bigalloc.c +++ b/lib/bigalloc.c @@ -2,6 +2,7 @@ * UCW Library -- Allocation of Large Aligned Buffers * * (c) 2006 Martin Mares + * (c) 2007 Pavel Charvat * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. @@ -10,6 +11,34 @@ #include "lib/lib.h" #include +#include + +void * +page_alloc(unsigned int len) +{ + ASSERT(!(len & (CPU_PAGE_SIZE-1))); + byte *p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); + if (p == (byte*) MAP_FAILED) + die("Cannot mmap %d bytes of memory: %m", len); + return p; +} + +void +page_free(void *start, unsigned int len) +{ + ASSERT(!(len & (CPU_PAGE_SIZE-1))); + ASSERT(!((uintptr_t) start & (CPU_PAGE_SIZE-1))); + munmap(start, len); +} + +void * +page_realloc(void *start, unsigned int old_len, unsigned int new_len) +{ + void *p = page_alloc(new_len); + memcpy(p, start, MIN(old_len, new_len)); + page_free(start, old_len); + return p; +} static unsigned int big_round(unsigned int len) @@ -24,9 +53,7 @@ big_alloc(unsigned int len) #ifdef CONFIG_DEBUG len += 2*CPU_PAGE_SIZE; #endif - byte *p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); - if (p == (byte*) MAP_FAILED) - die("Cannot mmap %d bytes of memory: %m", len); + byte *p = page_alloc(len); #ifdef CONFIG_DEBUG mprotect(p, CPU_PAGE_SIZE, PROT_NONE); mprotect(p+len-CPU_PAGE_SIZE, CPU_PAGE_SIZE, PROT_NONE); @@ -39,13 +66,12 @@ void big_free(void *start, unsigned int len) { byte *p = start; - ASSERT(!((addr_int_t) p & (CPU_PAGE_SIZE-1))); len = big_round(len); #ifdef CONFIG_DEBUG p -= CPU_PAGE_SIZE; len += 2*CPU_PAGE_SIZE; #endif - munmap(p, len); + page_free(p, len); } #ifdef TEST