summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric Bail <cedric.bail@samsung.com>2013-12-04 17:24:30 +0900
committerCedric Bail <cedric.bail@samsung.com>2013-12-04 18:33:04 +0900
commit3c7185e8806575f948fc4acca2f48443a1173f45 (patch)
treede1f4f7f62a4740797722e339d5b64be1355f283
parent517f339fd0cbcece6c796062290659cf501889be (diff)
Revert "eina: check if the complete hash match before checking if the key match during children walk."
This reverts commit 295babadb1675d1160b18c639dd6dcbe20b02cfb. The implementation of that said optimization is actually wrong.
-rw-r--r--src/lib/eina/eina_hash.c31
1 files changed, 9 insertions, 22 deletions
diff --git a/src/lib/eina/eina_hash.c b/src/lib/eina/eina_hash.c
index 0989f68342..dab865efe6 100644
--- a/src/lib/eina/eina_hash.c
+++ b/src/lib/eina/eina_hash.c
@@ -101,7 +101,6 @@ struct _Eina_Hash_Element
101{ 101{
102 EINA_RBTREE; 102 EINA_RBTREE;
103 Eina_Hash_Tuple tuple; 103 Eina_Hash_Tuple tuple;
104 int hash;
105}; 104};
106 105
107struct _Eina_Hash_Foreach_Data 106struct _Eina_Hash_Foreach_Data
@@ -172,21 +171,18 @@ _eina_hash_hash_rbtree_cmp_node(const Eina_Hash_Head *left,
172 171
173static inline int 172static inline int
174_eina_hash_key_rbtree_cmp_key_data(const Eina_Hash_Element *hash_element, 173_eina_hash_key_rbtree_cmp_key_data(const Eina_Hash_Element *hash_element,
175 const Eina_Hash_Element *tuple, 174 const Eina_Hash_Tuple *tuple,
176 EINA_UNUSED unsigned int key_length, 175 EINA_UNUSED unsigned int key_length,
177 Eina_Key_Cmp cmp) 176 Eina_Key_Cmp cmp)
178{ 177{
179 int result; 178 int result;
180 179
181 result = hash_element->hash - tuple->hash; 180 result = cmp(hash_element->tuple.key,
182 if (!result) 181 hash_element->tuple.key_length,
183 result = cmp(hash_element->tuple.key, 182 tuple->key,
184 hash_element->tuple.key_length, 183 tuple->key_length);
185 tuple->tuple.key,
186 tuple->tuple.key_length);
187 184
188 if (result == 0 && tuple->tuple.data && 185 if (result == 0 && tuple->data && tuple->data != hash_element->tuple.data)
189 tuple->tuple.data != hash_element->tuple.data)
190 return 1; 186 return 1;
191 187
192 return result; 188 return result;
@@ -199,10 +195,8 @@ _eina_hash_key_rbtree_cmp_node(const Eina_Hash_Element *left,
199{ 195{
200 int result; 196 int result;
201 197
202 result = left->hash - right->hash; 198 result = cmp(left->tuple.key, left->tuple.key_length,
203 if (result == 0) 199 right->tuple.key, right->tuple.key_length);
204 result = cmp(left->tuple.key, left->tuple.key_length,
205 right->tuple.key, right->tuple.key_length);
206 200
207 if (result < 0) 201 if (result < 0)
208 return EINA_RBTREE_LEFT; 202 return EINA_RBTREE_LEFT;
@@ -218,7 +212,6 @@ eina_hash_add_alloc_by_hash(Eina_Hash *hash,
218{ 212{
219 Eina_Hash_Element *new_hash_element = NULL; 213 Eina_Hash_Element *new_hash_element = NULL;
220 Eina_Hash_Head *hash_head; 214 Eina_Hash_Head *hash_head;
221 int original_key;
222 int hash_num; 215 int hash_num;
223 216
224 EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE); 217 EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE);
@@ -227,7 +220,6 @@ eina_hash_add_alloc_by_hash(Eina_Hash *hash,
227 EINA_MAGIC_CHECK_HASH(hash); 220 EINA_MAGIC_CHECK_HASH(hash);
228 221
229 /* Apply eina mask to hash. */ 222 /* Apply eina mask to hash. */
230 original_key = key_hash;
231 hash_num = key_hash & hash->mask; 223 hash_num = key_hash & hash->mask;
232 key_hash &= EINA_HASH_RBTREE_MASK; 224 key_hash &= EINA_HASH_RBTREE_MASK;
233 225
@@ -276,7 +268,6 @@ eina_hash_add_alloc_by_hash(Eina_Hash *hash,
276 /* Setup the element */ 268 /* Setup the element */
277 new_hash_element->tuple.key_length = key_length; 269 new_hash_element->tuple.key_length = key_length;
278 new_hash_element->tuple.data = (void *)data; 270 new_hash_element->tuple.data = (void *)data;
279 new_hash_element->hash = original_key;
280 if (alloc_length > 0) 271 if (alloc_length > 0)
281 { 272 {
282 new_hash_element->tuple.key = (char *)(new_hash_element + 1); 273 new_hash_element->tuple.key = (char *)(new_hash_element + 1);
@@ -330,10 +321,8 @@ _eina_hash_find_by_hash(const Eina_Hash *hash,
330 Eina_Hash_Head **hash_head) 321 Eina_Hash_Head **hash_head)
331{ 322{
332 Eina_Hash_Element *hash_element; 323 Eina_Hash_Element *hash_element;
333 Eina_Hash_Element tmp;
334 int rb_hash = key_hash & EINA_HASH_RBTREE_MASK; 324 int rb_hash = key_hash & EINA_HASH_RBTREE_MASK;
335 325
336 tmp.hash = key_hash;
337 key_hash &= hash->mask; 326 key_hash &= hash->mask;
338 327
339 if (!hash->buckets) 328 if (!hash->buckets)
@@ -348,11 +337,9 @@ _eina_hash_find_by_hash(const Eina_Hash *hash,
348 if (!*hash_head) 337 if (!*hash_head)
349 return NULL; 338 return NULL;
350 339
351 tmp.tuple = *tuple;
352
353 hash_element = (Eina_Hash_Element *) 340 hash_element = (Eina_Hash_Element *)
354 eina_rbtree_inline_lookup((*hash_head)->head, 341 eina_rbtree_inline_lookup((*hash_head)->head,
355 &tmp, 0, 342 tuple, 0,
356 EINA_RBTREE_CMP_KEY_CB( 343 EINA_RBTREE_CMP_KEY_CB(
357 _eina_hash_key_rbtree_cmp_key_data), 344 _eina_hash_key_rbtree_cmp_key_data),
358 (const void *)hash->key_cmp_cb); 345 (const void *)hash->key_cmp_cb);