X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fsparse_vec.h;h=3bd440d5dbdaa3718aacb2d990e54bf6206fb03b;hb=b53b88a08ef25031708d1e51960713845752c6f2;hp=fc8b3cf1e8e7c113a22ee476500f88b05c3faec3;hpb=7b90f669d83f432f3610ec0da522bd8ccc4dff01;p=vpp.git diff --git a/src/vppinfra/sparse_vec.h b/src/vppinfra/sparse_vec.h index fc8b3cf1e8e..3bd440d5dbd 100644 --- a/src/vppinfra/sparse_vec.h +++ b/src/vppinfra/sparse_vec.h @@ -59,7 +59,7 @@ typedef struct always_inline sparse_vec_header_t * sparse_vec_header (void *v) { - return vec_header (v, sizeof (sparse_vec_header_t)); + return vec_header (v); } /* Index 0 is always used to mark indices that are not valid in @@ -73,17 +73,14 @@ sparse_vec_new (uword elt_bytes, uword sparse_index_bits) void *v; sparse_vec_header_t *h; word n; + vec_attr_t va = { .elt_sz = elt_bytes, .hdr_sz = sizeof (h[0]) }; ASSERT (sparse_index_bits <= 16); - v = _vec_resize ((void *) 0, - /* length increment */ 8, - /* data bytes */ 8 * elt_bytes, - /* header bytes */ sizeof (h[0]), - /* data align */ 0); + v = _vec_alloc_internal (/* data bytes */ 8, &va); /* Make space for invalid entry (entry 0). */ - _vec_len (v) = 1; + _vec_set_len (v, 1, elt_bytes); h = sparse_vec_header (v); @@ -223,7 +220,19 @@ sparse_vec_index2 (void *v, *i1_return = is_member1 + d1; } -#define sparse_vec_free(v) vec_free(v) +#define sparse_vec_free(V) \ + do \ + { \ + if (V) \ + { \ + sparse_vec_header_t *_h = sparse_vec_header (V); \ + vec_free (_h->is_member_bitmap); \ + vec_free (_h->member_counts); \ + clib_mem_free (_h); \ + V = 0; \ + } \ + } \ + while (0) #define sparse_vec_elt_at_index(v,i) \ vec_elt_at_index ((v), sparse_vec_index ((v), (i)))