[Libguestfs] [PATCH libnbd 3/7] common/utils/vector: Rename `alloc` to `cap`

Richard W.M. Jones rjones at redhat.com
Sat Oct 30 17:37:44 UTC 2021


On Sat, Oct 30, 2021 at 07:56:07PM +0300, Nir Soffer wrote:
> The `alloc` field is the maximum number of items you can append to a
> vector before it need to be resized. This may confuse users with the
> size of the `ptr` array which is `alloc * itemsize`. Rename to "cap",
> common term for this property in many languages (e.g C++, Rust, Go).

cap is short for "capacity"?  I didn't know about this convention but
I see that C++ std::vector does indeed call this field "__end_cap".
(Also weirdly it stores the vector as a pointer to the beginning and
end - I guess that's to make C++ iterators easier?)

I suspect this (and the next patch) is going to break callers since
they can touch these fields directly ...

> Signed-off-by: Nir Soffer <nsoffer at redhat.com>
> ---
>  common/utils/vector.c | 16 ++++++++--------
>  common/utils/vector.h | 10 +++++-----
>  lib/crypto.c          |  4 ++--
>  3 files changed, 15 insertions(+), 15 deletions(-)
> 
> diff --git a/common/utils/vector.c b/common/utils/vector.c
> index 7df17e1..a4b43ce 100644
> --- a/common/utils/vector.c
> +++ b/common/utils/vector.c
> @@ -41,21 +41,21 @@ int
>  generic_vector_reserve (struct generic_vector *v, size_t n, size_t itemsize)
>  {
>    void *newptr;
> -  size_t reqalloc, newalloc;
> +  size_t reqcap, newcap;
>  
> -  reqalloc = v->alloc + n;
> -  if (reqalloc < v->alloc)
> +  reqcap = v->cap + n;
> +  if (reqcap < v->cap)
>      return -1; /* overflow */
>  
> -  newalloc = (v->alloc * 3 + 1) / 2;
> +  newcap = (v->cap * 3 + 1) / 2;
>  
> -  if (newalloc < reqalloc)
> -    newalloc = reqalloc;
> +  if (newcap < reqcap)
> +    newcap = reqcap;
>  
> -  newptr = realloc (v->ptr, newalloc * itemsize);
> +  newptr = realloc (v->ptr, newcap * itemsize);
>    if (newptr == NULL)
>      return -1;
>    v->ptr = newptr;
> -  v->alloc = newalloc;
> +  v->cap = newcap;
>    return 0;
>  }
> diff --git a/common/utils/vector.h b/common/utils/vector.h
> index 69aad8d..3fc8b68 100644
> --- a/common/utils/vector.h
> +++ b/common/utils/vector.h
> @@ -86,7 +86,7 @@
>    struct name {                                                         \
>      type *ptr;                 /* Pointer to array of items. */         \
>      size_t size;               /* Number of valid items in the array. */ \
> -    size_t alloc;              /* Number of items allocated. */         \
> +    size_t cap;                /* Maximum number of items. */           \
>    };                                                                    \
>    typedef struct name name;                                             \
>                                                                          \
> @@ -106,7 +106,7 @@
>    name##_insert (name *v, type elem, size_t i)                          \
>    {                                                                     \
>      assert (i <= v->size);                                              \
> -    if (v->size >= v->alloc) {                                          \
> +    if (v->size >= v->cap) {                                            \
>        if (name##_reserve (v, 1) == -1) return -1;                       \
>      }                                                                   \
>      memmove (&v->ptr[i+1], &v->ptr[i], (v->size-i) * sizeof (elem));    \
> @@ -137,7 +137,7 @@
>    {                                                                     \
>      free (v->ptr);                                                      \
>      v->ptr = NULL;                                                      \
> -    v->size = v->alloc = 0;                                             \
> +    v->size = v->cap = 0;                                               \
>    }                                                                     \
>                                                                          \
>    /* Iterate over the vector, calling f() on each element. */           \
> @@ -168,12 +168,12 @@
>                      (void *) compare);                                  \
>    }
>  
> -#define empty_vector { .ptr = NULL, .size = 0, .alloc = 0 }
> +#define empty_vector { .ptr = NULL, .size = 0, .cap = 0 }
>  
>  struct generic_vector {
>    void *ptr;
>    size_t size;
> -  size_t alloc;
> +  size_t cap;
>  };

and indeed ...

>  extern int generic_vector_reserve (struct generic_vector *v,
> diff --git a/lib/crypto.c b/lib/crypto.c
> index a9b3789..f570db3 100644
> --- a/lib/crypto.c
> +++ b/lib/crypto.c
> @@ -141,7 +141,7 @@ nbd_unlocked_get_tls_username (struct nbd_handle *h)
>    }
>  
>    for (;;) {
> -    if (getlogin_r (str.ptr, str.alloc) == 0) {
> +    if (getlogin_r (str.ptr, str.cap) == 0) {
>        return str.ptr;
>      }
>      else if (errno != ERANGE) {
> @@ -150,7 +150,7 @@ nbd_unlocked_get_tls_username (struct nbd_handle *h)
>        return NULL;
>      }
>      /* Try again with a larger buffer. */
> -    if (string_reserve (&str, str.alloc == 0 ? 16 : str.alloc * 2) == -1) {
> +    if (string_reserve (&str, str.cap == 0 ? 16 : str.cap * 2) == -1) {
>        set_error (errno, "realloc");
>        free (str.ptr);
>        return NULL;

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v




More information about the Libguestfs mailing list