Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}