X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fvppinfra%2Fhash.c;h=fc6c4518048da1761c99674129a84f4e86927e50;hb=5be3d4cc59ea955cff35ef962fd908e1147eea99;hp=6115b0cffd6cb575c672f754d74d1b9de4ecb03f;hpb=9fb6d40eb3d4a2da8f45187de773498b784596e6;p=vpp.git diff --git a/src/vppinfra/hash.c b/src/vppinfra/hash.c index 6115b0cffd6..fc6c4518048 100644 --- a/src/vppinfra/hash.c +++ b/src/vppinfra/hash.c @@ -271,7 +271,7 @@ hash_memory32 (void *p, word n_bytes, u32 state) } #endif -uword +__clib_export uword hash_memory (void *p, word n_bytes, uword state) { uword *q = p; @@ -548,6 +548,7 @@ lookup (void *v, uword key, enum lookup_opcode op, hash_t *h = hash_header (v); hash_pair_union_t *p = 0; uword found_key = 0; + uword value_bytes; uword i; if (!v) @@ -555,6 +556,7 @@ lookup (void *v, uword key, enum lookup_opcode op, i = key_sum (h, key) & (_vec_len (v) - 1); p = get_pair (v, i); + value_bytes = hash_value_bytes (h); if (hash_is_user (v, i)) { @@ -564,9 +566,8 @@ lookup (void *v, uword key, enum lookup_opcode op, if (op == UNSET) { set_is_user (v, i, 0); - if (old_value) - clib_memcpy_fast (old_value, p->direct.value, - hash_value_bytes (h)); + if (old_value && value_bytes) + clib_memcpy_fast (old_value, p->direct.value, value_bytes); zero_pair (h, &p->direct); } } @@ -598,9 +599,8 @@ lookup (void *v, uword key, enum lookup_opcode op, found_key = p != 0; if (found_key && op == UNSET) { - if (old_value) - clib_memcpy_fast (old_value, &p->direct.value, - hash_value_bytes (h)); + if (old_value && value_bytes) + clib_memcpy_fast (old_value, &p->direct.value, value_bytes); unset_indirect (v, i, &p->direct); @@ -611,12 +611,12 @@ lookup (void *v, uword key, enum lookup_opcode op, } } - if (op == SET && p != 0) + if (op == SET && p != 0 && value_bytes) { /* Save away old value for caller. */ if (old_value && found_key) - clib_memcpy_fast (old_value, &p->direct.value, hash_value_bytes (h)); - clib_memcpy_fast (&p->direct.value, new_value, hash_value_bytes (h)); + clib_memcpy_fast (old_value, &p->direct.value, value_bytes); + clib_memcpy_fast (&p->direct.value, new_value, value_bytes); } if (op == SET) @@ -628,7 +628,7 @@ lookup (void *v, uword key, enum lookup_opcode op, } /* Fetch value of key. */ -uword * +__clib_export uword * _hash_get (void *v, uword key) { hash_t *h = hash_header (v); @@ -647,14 +647,14 @@ _hash_get (void *v, uword key) return &p->value[0]; } -hash_pair_t * +__clib_export hash_pair_t * _hash_get_pair (void *v, uword key) { return lookup (v, key, GET, 0, 0); } -hash_pair_t * -hash_next (void *v, hash_next_t * hn) +__clib_export hash_pair_t * +hash_next (void *v, hash_next_t *hn) { hash_t *h = hash_header (v); hash_pair_t *p; @@ -707,7 +707,7 @@ hash_next (void *v, hash_next_t * hn) } /* Remove key from table. */ -void * +__clib_export void * _hash_unset (void *v, uword key, void *old_value) { hash_t *h; @@ -728,7 +728,7 @@ _hash_unset (void *v, uword key, void *old_value) return v; } -void * +__clib_export void * _hash_create (uword elts, hash_t * h_user) { hash_t *h; @@ -774,7 +774,7 @@ _hash_create (uword elts, hash_t * h_user) return v; } -void * +__clib_export void * _hash_free (void *v) { hash_t *h = hash_header (v); @@ -830,13 +830,13 @@ hash_resize (void *old, uword new_size) return hash_resize_internal (old, new_size, 1); } -void * +__clib_export void * hash_dup (void *old) { return hash_resize_internal (old, vec_len (old), 0); } -void * +__clib_export void * _hash_set3 (void *v, uword key, void *value, void *old_value) { hash_t *h; @@ -857,14 +857,14 @@ _hash_set3 (void *v, uword key, void *value, void *old_value) return v; } -uword +__clib_export uword vec_key_sum (hash_t * h, uword key) { void *v = uword_to_pointer (key, void *); return hash_memory (v, vec_len (v) * h->user, 0); } -uword +__clib_export uword vec_key_equal (hash_t * h, uword key1, uword key2) { void *v1 = uword_to_pointer (key1, void *); @@ -874,7 +874,7 @@ vec_key_equal (hash_t * h, uword key1, uword key2) return l1 == l2 && 0 == memcmp (v1, v2, l1 * h->user); } -u8 * +__clib_export u8 * vec_key_format_pair (u8 * s, va_list * args) { void *CLIB_UNUSED (user_arg) = va_arg (*args, void *); @@ -925,14 +925,14 @@ vec_key_format_pair (u8 * s, va_list * args) return s; } -uword +__clib_export uword mem_key_sum (hash_t * h, uword key) { uword *v = uword_to_pointer (key, void *); return hash_memory (v, h->user, 0); } -uword +__clib_export uword mem_key_equal (hash_t * h, uword key1, uword key2) { void *v1 = uword_to_pointer (key1, void *); @@ -990,7 +990,7 @@ hash_format_pair_default (u8 * s, va_list * args) return s; } -uword +__clib_export uword hash_bytes (void *v) { uword i, bytes; @@ -1015,8 +1015,8 @@ hash_bytes (void *v) return bytes; } -u8 * -format_hash (u8 * s, va_list * va) +__clib_export u8 * +format_hash (u8 *s, va_list *va) { void *v = va_arg (*va, void *); int verbose = va_arg (*va, int); @@ -1098,19 +1098,19 @@ unformat_hash_string_internal (unformat_input_t * input, return p ? 1 : 0; } -uword +__clib_export uword unformat_hash_vec_string (unformat_input_t * input, va_list * va) { return unformat_hash_string_internal (input, va, /* is_vec */ 1); } -uword +__clib_export uword unformat_hash_string (unformat_input_t * input, va_list * va) { return unformat_hash_string_internal (input, va, /* is_vec */ 0); } -clib_error_t * +__clib_export clib_error_t * hash_validate (void *v) { hash_t *h = hash_header (v);