X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Ffifo.h;h=b6a8b8f5c3bb14ebeee7916e9527cec9f3632bc2;hb=4fe09e9f297985e3f452f7722c138d393e8533af;hp=5dc1b4512cfd4901d91346c8ccd868bb1d2a1f21;hpb=178cf493d009995b28fdf220f04c98860ff79a9b;p=vpp.git diff --git a/src/vppinfra/fifo.h b/src/vppinfra/fifo.h index 5dc1b4512cf..b6a8b8f5c3b 100644 --- a/src/vppinfra/fifo.h +++ b/src/vppinfra/fifo.h @@ -54,7 +54,7 @@ typedef struct always_inline clib_fifo_header_t * clib_fifo_header (void *f) { - return vec_header (f, sizeof (clib_fifo_header_t)); + return vec_header (f); } /* Aliases. */ @@ -91,31 +91,31 @@ clib_fifo_reset (void *v) if (v) { f->head_index = f->tail_index = 0; - _vec_len (v) = 0; + vec_set_len (v, 0); } } /* External resize function. */ -void *_clib_fifo_resize (void *v, uword n_elts, uword elt_bytes); +void *_clib_fifo_resize (void *v, uword n_elts, uword align, uword elt_bytes); -#define clib_fifo_resize(f,n_elts) \ - f = _clib_fifo_resize ((f), (n_elts), sizeof ((f)[0])) +#define clib_fifo_resize(f, n_elts) \ + f = _clib_fifo_resize ((f), (n_elts), _vec_align (f, 0), _vec_elt_sz (f)) always_inline void * -_clib_fifo_validate (void *v, uword n_elts, uword elt_bytes) +_clib_fifo_validate (void *v, uword n_elts, uword align, uword elt_bytes) { if (clib_fifo_free_elts (v) < n_elts) - v = _clib_fifo_resize (v, n_elts, elt_bytes); + v = _clib_fifo_resize (v, n_elts, align, elt_bytes); return v; } -#define clib_fifo_validate(f,n_elts) \ - f = _clib_fifo_validate ((f), (n_elts), sizeof (f[0])) +#define clib_fifo_validate(f, n_elts) \ + f = _clib_fifo_validate ((f), (n_elts), _vec_align (f, 0), _vec_elt_sz (f)) /* Advance tail pointer by N_ELTS which can be either positive or negative. */ always_inline void * -_clib_fifo_advance_tail (void *v, word n_elts, uword elt_bytes, - uword * tail_return) +_clib_fifo_advance_tail (void *v, word n_elts, uword align, uword elt_bytes, + uword *tail_return) { word i, l, n_free; clib_fifo_header_t *f; @@ -123,7 +123,7 @@ _clib_fifo_advance_tail (void *v, word n_elts, uword elt_bytes, n_free = clib_fifo_free_elts (v); if (n_free < n_elts) { - v = _clib_fifo_resize (v, n_elts, elt_bytes); + v = _clib_fifo_resize (v, n_elts, align, elt_bytes); n_free = clib_fifo_free_elts (v); } @@ -158,12 +158,13 @@ _clib_fifo_advance_tail (void *v, word n_elts, uword elt_bytes, return v; } -#define clib_fifo_advance_tail(f,n_elts) \ -({ \ - uword _i; \ - (f) = _clib_fifo_advance_tail ((f), (n_elts), sizeof ((f)[0]), &_i); \ - (f) + _i; \ -}) +#define clib_fifo_advance_tail(f, n_elts) \ + ({ \ + uword _i; \ + (f) = _clib_fifo_advance_tail ((f), (n_elts), _vec_align (f, 0), \ + _vec_elt_sz (f), &_i); \ + (f) + _i; \ + }) always_inline uword clib_fifo_advance_head (void *v, uword n_elts) @@ -189,36 +190,46 @@ clib_fifo_advance_head (void *v, uword n_elts) } /* Add given element to fifo. */ -#define clib_fifo_add1(f,e) \ -do { \ - uword _i; \ - (f) = _clib_fifo_advance_tail ((f), 1, sizeof ((f)[0]), &_i); \ - (f)[_i] = (e); \ -} while (0) +#define clib_fifo_add1(f, e) \ + do \ + { \ + uword _i; \ + (f) = _clib_fifo_advance_tail ((f), 1, _vec_align (f, 0), \ + _vec_elt_sz (f), &_i); \ + (f)[_i] = (e); \ + } \ + while (0) /* Add element to fifo; return pointer to new element. */ -#define clib_fifo_add2(f,p) \ -do { \ - uword _i; \ - (f) = _clib_fifo_advance_tail ((f), 1, sizeof ((f)[0]), &_i); \ - (p) = (f) + _i; \ -} while (0) +#define clib_fifo_add2(f, p) \ + do \ + { \ + uword _i; \ + (f) = _clib_fifo_advance_tail ((f), 1, _vec_align (f, 0), \ + _vec_elt_sz (f), &_i); \ + (p) = (f) + _i; \ + } \ + while (0) /* Add several elements to fifo. */ -#define clib_fifo_add(f,e,n) \ -do { \ - uword _i, _l; word _n0, _n1; \ - \ - _n0 = (n); \ - (f) = _clib_fifo_advance_tail ((f), _n0, sizeof ((f)[0]), &_i); \ - _l = clib_fifo_len (f); \ - _n1 = _i + _n0 - _l; \ - _n1 = _n1 < 0 ? 0 : _n1; \ - _n0 -= _n1; \ - clib_memcpy_fast ((f) + _i, (e), _n0 * sizeof ((f)[0])); \ - if (_n1) \ - clib_memcpy_fast ((f) + 0, (e) + _n0, _n1 * sizeof ((f)[0])); \ -} while (0) +#define clib_fifo_add(f, e, n) \ + do \ + { \ + uword _i, _l; \ + word _n0, _n1; \ + \ + _n0 = (n); \ + (f) = _clib_fifo_advance_tail ((f), _n0, _vec_align (f, 0), \ + _vec_elt_sz (f), &_i); \ + _l = clib_fifo_len (f); \ + _n1 = _i + _n0 - _l; \ + _n1 = _n1 < 0 ? 0 : _n1; \ + _n0 -= _n1; \ + clib_memcpy_fast ((f) + _i, (e), _n0 * sizeof ((f)[0])); \ + if (_n1) \ + clib_memcpy_fast ((f) + 0, (e) + _n0, _n1 * sizeof ((f)[0])); \ + } \ + while (0) /* Subtract element from fifo. */ #define clib_fifo_sub1(f,e) \ @@ -254,7 +265,7 @@ clib_fifo_tail_index (void *v) #define clib_fifo_head(v) ((v) + clib_fifo_head_index (v)) #define clib_fifo_tail(v) ((v) + clib_fifo_tail_index (v)) -#define clib_fifo_free(f) vec_free_h((f),sizeof(clib_fifo_header_t)) +#define clib_fifo_free(f) vec_free ((f)) always_inline uword clib_fifo_elt_index (void *v, uword i) @@ -274,7 +285,7 @@ clib_fifo_elt_index (void *v, uword i) return result; } -#define clib_fifo_elt_at_index(v,i) ((v) + clib_fifo_elt_index (v, (i))) +#define clib_fifo_elt_at_index(v, i) ((v) + (i)) #define clib_fifo_foreach(v,f,body) \ do { \