summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2014-12-03 13:56:22 +0400
committerSergey Vojtovich <svoj@mariadb.org>2014-12-03 13:56:22 +0400
commit037dcf25e94990e5a2f008f96e1813b7149b91ed (patch)
tree8193e6e323ca6b8fe87432a22983b8d07f712e81
parent3014e137885b0293d1ed6834c45d53a675bbc622 (diff)
downloadmariadb-git-bb-lf-iterator.tar.gz
MDEV-6089 - MySQL WL#7305 "Improve MDL scalability by using lock-free hash"bb-lf-iterator
This is prerequisite for MDEV-6089. Added lf_hash_search_using_hash_value(), which can reuse previously calculated hash value.
-rw-r--r--include/lf.h3
-rw-r--r--mysys/lf_hash.c14
2 files changed, 14 insertions, 3 deletions
diff --git a/include/lf.h b/include/lf.h
index 5ca777dd680..b776c152ee5 100644
--- a/include/lf.h
+++ b/include/lf.h
@@ -231,6 +231,9 @@ void lf_hash_init(LF_HASH *hash, uint element_size, uint flags,
void lf_hash_destroy(LF_HASH *hash);
int lf_hash_insert(LF_HASH *hash, LF_PINS *pins, const void *data);
void *lf_hash_search(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen);
+void *lf_hash_search_using_hash_value(LF_HASH *hash, LF_PINS *pins,
+ my_hash_value_type hash_value,
+ const void *key, uint keylen);
int lf_hash_delete(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen);
int lf_hash_iterate(LF_HASH *hash, LF_PINS *pins,
my_hash_walk_action action, void *argument);
diff --git a/mysys/lf_hash.c b/mysys/lf_hash.c
index 782ebc00f24..6a3659c20ac 100644
--- a/mysys/lf_hash.c
+++ b/mysys/lf_hash.c
@@ -467,12 +467,13 @@ int lf_hash_delete(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen)
NOTE
see lsearch() for pin usage notes
*/
-void *lf_hash_search(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen)
+void *lf_hash_search_using_hash_value(LF_HASH *hash, LF_PINS *pins,
+ my_hash_value_type hashnr,
+ const void *key, uint keylen)
{
LF_SLIST * volatile *el, *found;
- uint bucket, hashnr= calc_hash(hash, (uchar *)key, keylen);
+ uint bucket= hashnr % hash->size;
- bucket= hashnr % hash->size;
lf_rwlock_by_pins(pins);
el= _lf_dynarray_lvalue(&hash->array, bucket);
if (unlikely(!el))
@@ -521,6 +522,13 @@ int lf_hash_iterate(LF_HASH *hash, LF_PINS *pins,
return res;
}
+void *lf_hash_search(LF_HASH *hash, LF_PINS *pins, const void *key, uint keylen)
+{
+ return lf_hash_search_using_hash_value(hash, pins,
+ calc_hash(hash, (uchar*) key, keylen),
+ key, keylen);
+}
+
static const uchar *dummy_key= (uchar*)"";
/*