struct page* region_get_mem(size_t s) { size_t request_bytes; void *mem; struct page *newp; /* Don't get less than K * RPAGESIZE extra memory (K * RPAGESIZE * is the minimum useful size for something on unused_pages) */ if ( (unsigned long)s + (unsigned long)K * RPAGESIZE < (unsigned long)MINIMUM_MEM_REQUEST ) request_bytes = MINIMUM_MEM_REQUEST; else request_bytes = s; mem = malloc(request_bytes + RPAGESIZE); if (!mem) return NULL; newp = PALIGN(mem, RPAGESIZE); if (mem == newp) /* Maybe we were lucky! */ request_bytes += RPAGESIZE; #ifndef NMEMDEBUG set_region_range(newp, (char*)newp + request_bytes, FREEPAGE); #endif /* ifndef NMEMDEBUG */ total_page_count += request_bytes >> RPAGELOG; /* this should be atomic * */ newp->pagecount = request_bytes >> RPAGELOG; newp->free = 1; return newp; }
struct page* region_get_mem(size_t s) { struct page *newp, *tmp; #if 0 s = ALIGN(s, 65536); #endif /* if 0 */ newp = (struct page*)MMAP(0, s, PROT_READ | PROT_WRITE, MAP_PRIVATE); if (!newp) return NULL; if (PALIGN(newp, RPAGESIZE) != newp) abort(); /* Add the new memory to unused_pages */ #ifndef NMEMDEBUG set_region_range(newp, (char*)newp + s, FREEPAGE); #endif /* ifndef NMEMDEBUG */ total_page_count += s >> RPAGELOG; /* This should be atomic */ newp->pagecount = s >> RPAGELOG; newp->free = 1; return newp; }
struct page *region_get_mem(size_t s) { size_t request_bytes; void *mem; struct page *newp; /* Don't get less than K * RPAGESIZE extra memory (K * RPAGESIZE is the minimum useful size for something on unused_pages) */ if (s + K * RPAGESIZE < MINIMUM_MEM_REQUEST) request_bytes = MINIMUM_MEM_REQUEST; else request_bytes = s; #if 0 request_bytes = ALIGN(request_bytes, 65536); #endif mem = (struct page *)MMAP(0, request_bytes+RPAGESIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE); if (!mem) { out_of_memory(); abort(); } VALGRIND_MALLOCLIKE_BLOCK(mem, request_bytes+RPAGESIZE, 0, 0); // VALGRIND_MAKE_NOACCESS(mem, request_bytes+RPAGESIZE); newp = PALIGN(mem, RPAGESIZE); VALGRIND_MAKE_WRITABLE(newp, sizeof(struct page)); memset(newp, 0, sizeof(struct page)); if (mem == newp) /* Maybe we were lucky! */ request_bytes += RPAGESIZE; addbyaddress(newp); /* Add the new memory to unused_pages */ #ifndef NMEMDEBUG set_region_range(newp, (char *)newp + s, FREEPAGE); #endif total_page_count += request_bytes >> RPAGELOG; newp->pagecount = request_bytes >> RPAGELOG; assert(newp->pagecount > 0); newp->free = 1; addfront(&unused_pages, newp); return newp; }
struct page *region_get_mem(size_t s) { size_t request_bytes; void *mem; struct page *newp; /* Don't get less than K * RPAGESIZE extra memory (K * RPAGESIZE is the minimum useful size for something on unused_pages) */ if (s + K * RPAGESIZE < MINIMUM_MEM_REQUEST) request_bytes = MINIMUM_MEM_REQUEST; else request_bytes = s; mem = xmalloc(request_bytes + RPAGESIZE); // memset(mem, 0, request_bytes + RPAGESIZE); // VALGRIND_MAKE_NOACCESS(mem, request_bytes + RPAGESIZE); newp = PALIGN(mem, RPAGESIZE); // fprintf(stderr, "## region_get_mem: s=%d, request_bytes=%d, mem=%p, newp=%p\n", s, request_bytes, mem, newp); // VALGRIND_MAKE_WRITABLE(newp, sizeof(struct page)); memset(newp, 0, sizeof(struct page)); if (mem == newp) /* Maybe we were lucky! */ request_bytes += RPAGESIZE; addbyaddress(newp); /* Add the new memory to unused_pages */ #ifndef NMEMDEBUG set_region_range(newp, (char *)newp + request_bytes, FREEPAGE); #endif total_page_count += request_bytes >> RPAGELOG; newp->pagecount = request_bytes >> RPAGELOG; assert(newp->pagecount > 0); newp->free = 1; addfront(&unused_pages, newp); return newp; }