32 #ifndef UNIV_HOTBACKUP
39 typedef void* hash_node_t;
42 #define hash_create hash0_create
53 #ifndef UNIV_HOTBACKUP
61 #ifdef UNIV_SYNC_DEBUG
66 #ifdef UNIV_SYNC_DEBUG
67 # define hash_create_mutexes(t,n,level) hash_create_mutexes_func(t,level,n)
69 # define hash_create_mutexes(t,n,level) hash_create_mutexes_func(t,n)
89 #ifndef UNIV_HOTBACKUP
92 # define HASH_ASSERT_OWNED(TABLE, FOLD) \
93 ut_ad(!(TABLE)->mutexes || mutex_own(hash_get_mutex(TABLE, FOLD)));
95 # define HASH_ASSERT_OWNED(TABLE, FOLD)
101 #define HASH_INSERT(TYPE, NAME, TABLE, FOLD, DATA)\
103 hash_cell_t* cell3333;\
106 HASH_ASSERT_OWNED(TABLE, FOLD)\
108 (DATA)->NAME = NULL;\
110 cell3333 = hash_get_nth_cell(TABLE, hash_calc_hash(FOLD, TABLE));\
112 if (cell3333->node == NULL) {\
113 cell3333->node = DATA;\
115 struct3333 = (TYPE*) cell3333->node;\
117 while (struct3333->NAME != NULL) {\
119 struct3333 = (TYPE*) struct3333->NAME;\
122 struct3333->NAME = DATA;\
126 #ifdef UNIV_HASH_DEBUG
127 # define HASH_ASSERT_VALID(DATA) ut_a((void*) (DATA) != (void*) -1)
128 # define HASH_INVALIDATE(DATA, NAME) DATA->NAME = (void*) -1
130 # define HASH_ASSERT_VALID(DATA) do {} while (0)
131 # define HASH_INVALIDATE(DATA, NAME) do {} while (0)
137 #define HASH_DELETE(TYPE, NAME, TABLE, FOLD, DATA)\
139 hash_cell_t* cell3333;\
142 HASH_ASSERT_OWNED(TABLE, FOLD)\
144 cell3333 = hash_get_nth_cell(TABLE, hash_calc_hash(FOLD, TABLE));\
146 if (cell3333->node == DATA) {\
147 HASH_ASSERT_VALID(DATA->NAME);\
148 cell3333->node = DATA->NAME;\
150 struct3333 = (TYPE*) cell3333->node;\
152 while (struct3333->NAME != DATA) {\
154 struct3333 = (TYPE*) struct3333->NAME;\
158 struct3333->NAME = DATA->NAME;\
160 HASH_INVALIDATE(DATA, NAME);\
166 #define HASH_GET_FIRST(TABLE, HASH_VAL)\
167 (hash_get_nth_cell(TABLE, HASH_VAL)->node)
172 #define HASH_GET_NEXT(NAME, DATA) ((DATA)->NAME)
176 #define HASH_SEARCH(NAME, TABLE, FOLD, TYPE, DATA, ASSERTION, TEST)\
179 HASH_ASSERT_OWNED(TABLE, FOLD)\
181 (DATA) = (TYPE) HASH_GET_FIRST(TABLE, hash_calc_hash(FOLD, TABLE));\
182 HASH_ASSERT_VALID(DATA);\
184 while ((DATA) != NULL) {\
189 HASH_ASSERT_VALID(HASH_GET_NEXT(NAME, DATA));\
190 (DATA) = (TYPE) HASH_GET_NEXT(NAME, DATA);\
197 #define HASH_SEARCH_ALL(NAME, TABLE, TYPE, DATA, ASSERTION, TEST) \
201 for (i3333 = (TABLE)->n_cells; i3333--; ) { \
202 (DATA) = (TYPE) HASH_GET_FIRST(TABLE, i3333); \
204 while ((DATA) != NULL) { \
205 HASH_ASSERT_VALID(DATA); \
212 (DATA) = (TYPE) HASH_GET_NEXT(NAME, DATA); \
215 if ((DATA) != NULL) { \
252 #define HASH_DELETE_AND_COMPACT(TYPE, NAME, TABLE, NODE)\
256 hash_cell_t* cell111;\
259 fold111 = (NODE)->fold;\
261 HASH_DELETE(TYPE, NAME, TABLE, fold111, NODE);\
263 top_node111 = (TYPE*)mem_heap_get_top(\
264 hash_get_heap(TABLE, fold111),\
270 if (NODE != top_node111) {\
274 *(NODE) = *top_node111;\
276 cell111 = hash_get_nth_cell(TABLE,\
277 hash_calc_hash(top_node111->fold, TABLE));\
281 if (cell111->node == top_node111) {\
284 cell111->node = NODE;\
288 node111 = static_cast<TYPE *>(cell111->node);\
290 while (top_node111 != HASH_GET_NEXT(NAME, node111)) {\
292 node111 = static_cast<TYPE *>(HASH_GET_NEXT(NAME, node111));\
297 node111->NAME = NODE;\
303 mem_heap_free_top(hash_get_heap(TABLE, fold111), sizeof(TYPE));\
306 #ifndef UNIV_HOTBACKUP
310 #define HASH_MIGRATE(OLD_TABLE, NEW_TABLE, NODE_TYPE, PTR_NAME, FOLD_FUNC) \
313 ulint cell_count2222;\
315 cell_count2222 = hash_get_n_cells(OLD_TABLE);\
317 for (i2222 = 0; i2222 < cell_count2222; i2222++) {\
318 NODE_TYPE* node2222 = static_cast<NODE_TYPE *>(HASH_GET_FIRST((OLD_TABLE), i2222));\
321 NODE_TYPE* next2222 = static_cast<NODE_TYPE *>(node2222->PTR_NAME);\
322 ulint fold2222 = FOLD_FUNC(node2222);\
324 HASH_INSERT(NODE_TYPE, PTR_NAME, (NEW_TABLE),\
325 fold2222, node2222);\
327 node2222 = next2222;\
408 # define hash_get_heap(table, fold) ((table)->heap)
409 # define hash_mutex_enter(table, fold) ((void) 0)
410 # define hash_mutex_exit(table, fold) ((void) 0)
419 #if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
420 # ifndef UNIV_HOTBACKUP
427 #ifndef UNIV_HOTBACKUP
440 # define HASH_TABLE_MAGIC_N 76561114
445 #include "hash0hash.ic"
UNIV_INTERN void hash_create_mutexes_func(hash_table_t *table, ulint n_mutexes)
UNIV_INLINE mem_heap_t * hash_get_heap(hash_table_t *table, ulint fold)
UNIV_INLINE ulint hash_calc_hash(ulint fold, hash_table_t *table)
UNIV_INTERN hash_table_t * hash_create(ulint n)
UNIV_INLINE ulint hash_get_mutex_no(hash_table_t *table, ulint fold)
UNIV_INTERN void hash_mutex_enter_all(hash_table_t *table)
UNIV_INTERN void hash_table_free(hash_table_t *table)
UNIV_INLINE mem_heap_t * hash_get_nth_heap(hash_table_t *table, ulint i)
UNIV_INTERN void hash_mutex_exit(hash_table_t *table, ulint fold)
UNIV_INLINE void hash_table_clear(hash_table_t *table)
UNIV_INTERN void hash_mutex_exit_all(hash_table_t *table)
UNIV_INLINE hash_cell_t * hash_get_nth_cell(hash_table_t *table, ulint n)
UNIV_INLINE mutex_t * hash_get_nth_mutex(hash_table_t *table, ulint i)
UNIV_INTERN void hash_mutex_enter(hash_table_t *table, ulint fold)
UNIV_INLINE mutex_t * hash_get_mutex(hash_table_t *table, ulint fold)
UNIV_INLINE ulint hash_get_n_cells(hash_table_t *table)