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
