Sergey Bugaev, le jeu. 06 mai 2021 15:56:31 +0300, a ecrit:
> libc already implements the functionality for allocating and managing
> memory blocks like the pagemap. Using libc functions gives us some
> additional niceties like overflow checking in reallocarray (). it also
> means that we will not allocate a whole page of memory if we need to
> store just a few integers.
Applied, thanks!
> ---
> libpager/object-terminate.c | 5 +++--
> libpager/pagemap.c | 26 +++++++++-----------------
> 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;
> }
> --
> 2.31.1
>
>
--
Samuel
*** s has joined channel #ens-mim
<N> re
<s> pfff
<s> mare de la pfp.
<s> pas commencer et j'en ai deja marre.
<s> bon ct juste un cou de gueule ++
*** s has left channel #ens-mim (s)
-+- #ens-mim et la peufeupeu -+-