On Sat, Oct 30, 2021 at 07:56:06PM +0300, Nir Soffer wrote:
> Minimize reallocs by growing the backing array by factor of 1.5.
> 
> Testing show that now append() is fast without calling reserve()
> upfront, simplifying code using vector.
> 
> $ ./test-vector | grep bench
> bench_reserve: 1000000 appends in 0.003997 s
> bench_append: 1000000 appends in 0.003869 s
> 
> In practice, this can make "nbdinfo --map" 10 milliseconds faster when
> running with image that have 500,000 extents.
> 
> Signed-off-by: Nir Soffer <[email protected]>
> ---
>  common/utils/vector.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/common/utils/vector.c b/common/utils/vector.c
> index 00cd254..7df17e1 100644
> --- a/common/utils/vector.c
> +++ b/common/utils/vector.c
> @@ -41,11 +41,21 @@ int
>  generic_vector_reserve (struct generic_vector *v, size_t n, size_t itemsize)
>  {
>    void *newptr;
> +  size_t reqalloc, newalloc;
>  
> -  newptr = realloc (v->ptr, (n + v->alloc) * itemsize);
> +  reqalloc = v->alloc + n;
> +  if (reqalloc < v->alloc)
> +    return -1; /* overflow */

abort()? -- maybe that would be exploitable.  But yes you're right it
should fail here.

> +  newalloc = (v->alloc * 3 + 1) / 2;
> +
> +  if (newalloc < reqalloc)
> +    newalloc = reqalloc;
> +
> +  newptr = realloc (v->ptr, newalloc * itemsize);
>    if (newptr == NULL)
>      return -1;
>    v->ptr = newptr;
> -  v->alloc += n;
> +  v->alloc = newalloc;
>    return 0;
>  }

This patch looks good, ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines.  Supports shell scripting,
bindings from many languages.  http://libguestfs.org

_______________________________________________
Libguestfs mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to