/* Support for an sbrk-like function that uses mmap.
- Copyright 1992 Free Software Foundation, Inc.
+ Copyright 1992, 2000 Free Software Foundation, Inc.
Contributed by Fred Fish at Cygnus Support. fnf@cygnus.com
#if defined(HAVE_MMAP)
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* Prototypes for lseek */
+#endif
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
it out. */
static size_t pagesize;
+#if NEED_DECLARATION_GETPAGESIZE
extern int getpagesize PARAMS ((void));
+#endif
#define PAGE_ALIGN(addr) (caddr_t) (((long)(addr) + pagesize - 1) & \
~(pagesize - 1))
+
+/* Return MAP_PRIVATE if MDP represents /dev/zero. Otherwise, return
+ MAP_SHARED. */
+
+#define MAP_PRIVATE_OR_SHARED(MDP) ((MDP -> flags & MMALLOC_DEVZERO) \
+ ? MAP_PRIVATE \
+ : MAP_SHARED)
+
+
/* Get core for the memory region specified by MDP, using SIZE as the
amount to either add to or subtract from the existing region. Works
like sbrk(), but using mmap(). */
{
/* Let mmap pick the map start address */
mapto = mmap (0, mapbytes, PROT_READ | PROT_WRITE,
- MAP_SHARED, mdp -> fd, foffset);
+ MAP_PRIVATE_OR_SHARED (mdp), mdp -> fd, foffset);
if (mapto != (caddr_t) -1)
{
mdp -> base = mdp -> breakval = mapto;
else
{
mapto = mmap (mdp -> top, mapbytes, PROT_READ | PROT_WRITE,
- MAP_SHARED | MAP_FIXED, mdp -> fd, foffset);
+ MAP_PRIVATE_OR_SHARED (mdp) | MAP_FIXED, mdp -> fd,
+ foffset);
if (mapto == mdp -> top)
{
mdp -> top = moveto;
/* FIXME: Quick hack, needs error checking and other attention. */
base = mmap (mdp -> base, mdp -> top - mdp -> base,
- PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED,
+ PROT_READ | PROT_WRITE, MAP_PRIVATE_OR_SHARED (mdp) | MAP_FIXED,
mdp -> fd, 0);
return ((PTR) base);
}
int size;
{
int fd;
+ int flags;
caddr_t base = NULL;
+#ifdef MAP_ANONYMOUS
+ flags = MAP_PRIVATE | MAP_ANONYMOUS;
+ fd = -1;
+#else
+#ifdef MAP_FILE
+ flags = MAP_PRIVATE | MAP_FILE;
+#else
+ flags = MAP_PRIVATE;
+#endif
fd = open ("/dev/zero", O_RDWR);
if (fd != -1)
{
- base = mmap (0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- if (base != (caddr_t) -1)
- {
- munmap (base, (size_t) size);
- }
+ return ((PTR) NULL);
+ }
+#endif
+ base = mmap (0, size, PROT_READ | PROT_WRITE, flags, fd, 0);
+ if (base != (caddr_t) -1)
+ {
+ munmap (base, (size_t) size);
+ }
+ if (fd != -1)
+ {
close (fd);
- if (base == 0)
- {
- /* Don't allow mapping at address zero. We use that value
- to signal an error return, and besides, it is useful to
- catch NULL pointers if it is unmapped. Instead start
- at the next page boundary. */
- base = (caddr_t) getpagesize ();
- }
- else if (base == (caddr_t) -1)
- {
- base = NULL;
- }
+ }
+ if (base == 0)
+ {
+ /* Don't allow mapping at address zero. We use that value
+ to signal an error return, and besides, it is useful to
+ catch NULL pointers if it is unmapped. Instead start
+ at the next page boundary. */
+ base = (caddr_t) getpagesize ();
+ }
+ else if (base == (caddr_t) -1)
+ {
+ base = NULL;
}
return ((PTR) base);
}