Feature #15331 » 0001-Add-st_update_with_hash.patch
| st.c | ||
|---|---|---|
|
{
|
||
|
}
|
||
|
ALWAYS_INLINE(static inline int
|
||
|
st_update_with_hash_inlined(st_table *tab, st_data_t key, st_data_t hash,
|
||
|
st_update_callback_func *func, st_data_t arg));
|
||
|
/* Find entry with KEY in table TAB, call FUNC with the key and the
|
||
|
value of the found entry, and non-zero as the 3rd argument. If the
|
||
|
entry is not found, call FUNC with KEY, and 2 zero arguments. If
|
||
|
the call returns ST_CONTINUE, the table will have an entry with key
|
||
|
and value returned by FUNC through the 1st and 2nd parameters. If
|
||
|
the call of FUNC returns ST_DELETE, the table will not have entry
|
||
|
with KEY. The function returns flag of that the entry with KEY was
|
||
|
value of the found entry, and non-zero as the 3rd argument. If the
|
||
|
entry is not found, call FUNC with KEY, and zero as the 3rd argument.
|
||
|
If the call returns ST_CONTINUE, the table will have an entry with key
|
||
|
and value returned by FUNC through the 1st and 2nd parameter.
|
||
|
If the call of FUNC returns ST_DELETE, the table will not have entry
|
||
|
with KEY. The function returns flag of that the entry with KEY was
|
||
|
in the table before the call. */
|
||
|
int
|
||
|
st_update(st_table *tab, st_data_t key,
|
||
|
st_update_callback_func *func, st_data_t arg)
|
||
|
{
|
||
|
st_hash_t hash = do_hash(key, tab);
|
||
|
return st_update_with_hash_inlined(tab, key, hash, func, arg);
|
||
|
}
|
||
|
/* st_update, but with caller-provided hash code for KEY. */
|
||
|
int
|
||
|
st_update_with_hash(st_table *tab, st_data_t key, st_index_t hash,
|
||
|
st_update_callback_func *func, st_data_t arg)
|
||
|
{
|
||
|
/* This remapping is also done in do_hash() */
|
||
|
st_hash_t remapped_hash = (hash == RESERVED_HASH_VAL) ? RESERVED_HASH_SUBSTITUTION_VAL : hash;
|
||
|
return st_update_with_hash_inlined(tab, key, remapped_hash, func, arg);
|
||
|
}
|
||
|
static inline int
|
||
|
st_update_with_hash_inlined(st_table *tab, st_data_t key, st_hash_t hash,
|
||
|
st_update_callback_func *func, st_data_t arg)
|
||
|
{
|
||
|
st_table_entry *entry = NULL; /* to avoid uninitialized value warning */
|
||
|
st_index_t bin = 0; /* Ditto */
|
||
| ... | ... | |
|
st_data_t value = 0, old_key;
|
||
|
st_index_t check;
|
||
|
int retval, existing;
|
||
|
st_hash_t hash = do_hash(key, tab);
|
||
|
retry:
|
||
|
entries = tab->entries;
|
||