summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libpager/object-terminate.c5
-rw-r--r--libpager/pagemap.c26
2 files changed, 12 insertions, 19 deletions
diff --git a/libpager/object-terminate.c b/libpager/object-terminate.c
index 95298217..3e7df167 100644
--- a/libpager/object-terminate.c
+++ b/libpager/object-terminate.c
@@ -17,6 +17,7 @@
#include "priv.h"
#include "memory_object_S.h"
+#include <stdlib.h>
#include <stdio.h>
/* Implement the object termination call from the kernel as described
@@ -118,10 +119,10 @@ _pager_free_structure (struct pager *p)
/* Free the pagemap */
if (p->pagemapsize)
{
- munmap (p->pagemap, p->pagemapsize * sizeof (* p->pagemap));
+ free (p->pagemap);
p->pagemapsize = 0;
p->pagemap = 0;
}
-
+
p->pager_state = NOTINIT;
}
diff --git a/libpager/pagemap.c b/libpager/pagemap.c
index 1570c75b..7bbb8c56 100644
--- a/libpager/pagemap.c
+++ b/libpager/pagemap.c
@@ -16,33 +16,25 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "priv.h"
+#include <stdlib.h>
#include <string.h>
/* Grow the pagemap of pager P as necessary to deal with address OFF */
error_t
_pager_pagemap_resize (struct pager *p, vm_address_t off)
{
- error_t err = 0;
-
off /= __vm_page_size;
if (p->pagemapsize < off)
{
- void *newaddr;
- vm_size_t newsize = round_page (off * sizeof (*p->pagemap))
- / sizeof (*p->pagemap);
-
- newaddr = mmap (0, newsize * sizeof (*p->pagemap),
- PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
- err = (newaddr == (void *) -1) ? errno : 0;
- if (! err)
- {
- memcpy (newaddr, p->pagemap, p->pagemapsize * sizeof (*p->pagemap));
- munmap (p->pagemap, p->pagemapsize * sizeof (*p->pagemap));
- p->pagemap = newaddr;
- p->pagemapsize = newsize;
- }
+ void *newaddr = reallocarray (p->pagemap, off,
+ sizeof (*p->pagemap));
+ if (!newaddr)
+ return errno;
+
+ p->pagemap = newaddr;
+ p->pagemapsize = off;
}
- return err;
+ return 0;
}