delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/2000/05/07/10:44:19

From: "Mark E." <snowball3 AT bigfoot DOT com>
To: gcc AT gcc DOT gnu DOT org
Date: Sun, 7 May 2000 11:33:06 -0400
MIME-Version: 1.0
Subject: Re: Perfomance of gc-simple
CC: lauras AT softhome DOT net, djgpp-workers AT delorie DOT com
Message-ID: <39155472.28917.25EC84@localhost>
References: <3913BE88 DOT 44A89056 AT softhome DOT net>
X-mailer: Pegasus Mail for Win32 (v3.12c)
Reply-To: djgpp-workers AT delorie DOT com

> > I recall Alexandre Oliva starting discussion about making gc-page use simple
> > malloc(), what about that?
> 
> You can easily use malloc() instead of mmap().  Just call malloc() with
> size+page_size-1 and align the return value.

What about a vmalloc that wraps calls to malloc?

Here is a crude implementation I came up with:

vmalloc_wrap.c:

#include <stdlib.h>
#include <unistd.h>

#ifndef HAVE_VMALLOC

#define VMALLOC_FREE(x) vmalloc_free (x)

static const unsigned int ptr_size = sizeof(char *);

void *
vmalloc (size_t size)
{
  char *unaligned_ptr, *aligned_ptr;
  int page_size = getpagesize();

  /* Provide space for aligning the returned pointer.  */
  size += page_size - 1;

  unaligned_ptr = malloc (size);

  /* Now align the pointer.  */
  aligned_ptr = (char *)((unsigned long)(unaligned_ptr + page_size) & ~(page_size - 
1));

  /* Record location to pass to free() in unused allocated space.  */
  *((char **)(aligned_ptr - ptr_size)) = unaligned_ptr;
  
  return aligned_ptr;
}


void
vmalloc_free (void *aligned_ptr)
{
  /* Recover the pointer allocated with malloc.  */
  char *unaligned_ptr = *(char **)((char *)(aligned_ptr - ptr_size));

  free (unaligned_ptr);
}
#else
#define VMALLOC_FREE(x) free (x)
#endif


Then use VMALLOC_FREE in ggc-page.c instead of free.

Mark

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019