Skip to content

Commit bd36a4c

Browse files
committed
introduce HASH_REPLACE() for hash_table_t
HASH_REPLACE(): allows to not travel through linked list twice when HASH_INSERT() happens right after HASH_DELETE()
1 parent 256994e commit bd36a4c

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

storage/innobase/buf/buf0buf.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2212,8 +2212,8 @@ buf_page_realloc(
22122212
ut_d(block->page.in_page_hash = FALSE);
22132213
ulint fold = block->page.id.fold();
22142214
ut_ad(fold == new_block->page.id.fold());
2215-
HASH_DELETE(buf_page_t, hash, buf_pool->page_hash, fold, (&block->page));
2216-
HASH_INSERT(buf_page_t, hash, buf_pool->page_hash, fold, (&new_block->page));
2215+
HASH_REPLACE(buf_page_t, hash, buf_pool->page_hash, fold,
2216+
&block->page, &new_block->page);
22172217

22182218
ut_ad(new_block->page.in_page_hash);
22192219

@@ -3329,8 +3329,8 @@ buf_relocate(
33293329
/* relocate buf_pool->page_hash */
33303330
ulint fold = bpage->id.fold();
33313331
ut_ad(fold == dpage->id.fold());
3332-
HASH_DELETE(buf_page_t, hash, buf_pool->page_hash, fold, bpage);
3333-
HASH_INSERT(buf_page_t, hash, buf_pool->page_hash, fold, dpage);
3332+
HASH_REPLACE(buf_page_t, hash, buf_pool->page_hash, fold, bpage,
3333+
dpage);
33343334
}
33353335

33363336
/** Hazard Pointer implementation. */

storage/innobase/include/hash0hash.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,18 @@ do {\
184184
HASH_INVALIDATE(DATA, NAME);\
185185
} while (0)
186186

187+
#define HASH_REPLACE(TYPE, NAME, TABLE, FOLD, DATA_OLD, DATA_NEW) \
188+
do { \
189+
(DATA_NEW)->NAME = (DATA_OLD)->NAME; \
190+
\
191+
hash_cell_t& cell3333 \
192+
= TABLE->array[hash_calc_hash(FOLD, TABLE)]; \
193+
TYPE** struct3333 = (TYPE**)&cell3333.node; \
194+
while (*struct3333 != DATA_OLD) { \
195+
struct3333 = &((*struct3333)->NAME); \
196+
} \
197+
*struct3333 = DATA_NEW; \
198+
} while (0)
187199
/*******************************************************************//**
188200
Gets the first struct in a hash chain, NULL if none. */
189201

0 commit comments

Comments
 (0)