mariadb/ha/hash0hash.c

150 lines
3.3 KiB
C
Raw Normal View History

2005-10-27 09:29:40 +02:00
/******************************************************
The simple hash table utility
(c) 1997 Innobase Oy
Created 5/20/1997 Heikki Tuuri
*******************************************************/
#include "hash0hash.h"
#ifdef UNIV_NONINL
#include "hash0hash.ic"
#endif
#include "mem0mem.h"
/****************************************************************
Reserves the mutex for a fold value in a hash table. */
UNIV_INTERN
2005-10-27 09:29:40 +02:00
void
hash_mutex_enter(
/*=============*/
hash_table_t* table, /* in: hash table */
ulint fold) /* in: fold */
2005-10-27 09:29:40 +02:00
{
mutex_enter(hash_get_mutex(table, fold));
}
/****************************************************************
Releases the mutex for a fold value in a hash table. */
UNIV_INTERN
2005-10-27 09:29:40 +02:00
void
hash_mutex_exit(
/*============*/
hash_table_t* table, /* in: hash table */
ulint fold) /* in: fold */
2005-10-27 09:29:40 +02:00
{
mutex_exit(hash_get_mutex(table, fold));
}
/****************************************************************
Reserves all the mutexes of a hash table, in an ascending order. */
UNIV_INTERN
2005-10-27 09:29:40 +02:00
void
hash_mutex_enter_all(
/*=================*/
hash_table_t* table) /* in: hash table */
2005-10-27 09:29:40 +02:00
{
ulint i;
for (i = 0; i < table->n_mutexes; i++) {
mutex_enter(table->mutexes + i);
}
}
/****************************************************************
Releases all the mutexes of a hash table. */
UNIV_INTERN
2005-10-27 09:29:40 +02:00
void
hash_mutex_exit_all(
/*================*/
hash_table_t* table) /* in: hash table */
2005-10-27 09:29:40 +02:00
{
ulint i;
for (i = 0; i < table->n_mutexes; i++) {
mutex_exit(table->mutexes + i);
}
}
/*****************************************************************
Creates a hash table with >= n array cells. The actual number of cells is
chosen to be a prime number slightly bigger than n. */
UNIV_INTERN
2005-10-27 09:29:40 +02:00
hash_table_t*
hash_create(
/*========*/
/* out, own: created table */
ulint n) /* in: number of array cells */
{
hash_cell_t* array;
ulint prime;
hash_table_t* table;
2005-10-27 09:29:40 +02:00
prime = ut_find_prime(n);
table = mem_alloc(sizeof(hash_table_t));
array = ut_malloc(sizeof(hash_cell_t) * prime);
branches/innodb+: Merge revisions 3544:3575 from branches/zip: ------------------------------------------------------------------------ r3572 | marko | 2008-12-17 11:19:56 +0200 (Wed, 17 Dec 2008) | 3 lines Changed paths: M /branches/zip/ChangeLog M /branches/zip/btr/btr0sea.c M /branches/zip/buf/buf0buf.c M /branches/zip/buf/buf0lru.c M /branches/zip/ha/ha0ha.c M /branches/zip/ha/hash0hash.c M /branches/zip/include/buf0buf.h M /branches/zip/include/ha0ha.h M /branches/zip/include/ha0ha.ic M /branches/zip/include/hash0hash.h M /branches/zip/include/univ.i branches/zip: Introduce UNIV_AHI_DEBUG for debugging the adaptive hash index without enabling UNIV_DEBUG. ------------------------------------------------------------------------ r3574 | marko | 2008-12-17 12:44:31 +0200 (Wed, 17 Dec 2008) | 2 lines Changed paths: M /branches/zip/ChangeLog branches/zip: ChangeLog: Document recent changes that were not included in InnoDB Plugin 1.0.2, except changes to source code comments. ------------------------------------------------------------------------ r3575 | marko | 2008-12-17 14:40:58 +0200 (Wed, 17 Dec 2008) | 12 lines Changed paths: M /branches/zip/ChangeLog M /branches/zip/include/row0sel.h M /branches/zip/include/row0upd.h M /branches/zip/pars/pars0pars.c M /branches/zip/row/row0mysql.c M /branches/zip/row/row0sel.c M /branches/zip/row/row0upd.c branches/zip: Remove update-in-place-in-select from the internal SQL interpreter. It was only used for updating the InnoDB internal data dictionary when renaming or dropping tables. It could have caused deadlocks after acquiring latches on insert buffer bitmap pages. This and r3544 should fix Issue #135. Furthermore, the update-in-place-in-select does not account for compression failure. That was not a problem yet, since the InnoDB SQL interpreter has so far assumed ROW_FORMAT=REDUNDANT. rb://63 approved by Heikki Tuuri ------------------------------------------------------------------------
2008-12-17 13:48:23 +01:00
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
2005-10-27 09:29:40 +02:00
table->adaptive = FALSE;
branches/innodb+: Merge revisions 3544:3575 from branches/zip: ------------------------------------------------------------------------ r3572 | marko | 2008-12-17 11:19:56 +0200 (Wed, 17 Dec 2008) | 3 lines Changed paths: M /branches/zip/ChangeLog M /branches/zip/btr/btr0sea.c M /branches/zip/buf/buf0buf.c M /branches/zip/buf/buf0lru.c M /branches/zip/ha/ha0ha.c M /branches/zip/ha/hash0hash.c M /branches/zip/include/buf0buf.h M /branches/zip/include/ha0ha.h M /branches/zip/include/ha0ha.ic M /branches/zip/include/hash0hash.h M /branches/zip/include/univ.i branches/zip: Introduce UNIV_AHI_DEBUG for debugging the adaptive hash index without enabling UNIV_DEBUG. ------------------------------------------------------------------------ r3574 | marko | 2008-12-17 12:44:31 +0200 (Wed, 17 Dec 2008) | 2 lines Changed paths: M /branches/zip/ChangeLog branches/zip: ChangeLog: Document recent changes that were not included in InnoDB Plugin 1.0.2, except changes to source code comments. ------------------------------------------------------------------------ r3575 | marko | 2008-12-17 14:40:58 +0200 (Wed, 17 Dec 2008) | 12 lines Changed paths: M /branches/zip/ChangeLog M /branches/zip/include/row0sel.h M /branches/zip/include/row0upd.h M /branches/zip/pars/pars0pars.c M /branches/zip/row/row0mysql.c M /branches/zip/row/row0sel.c M /branches/zip/row/row0upd.c branches/zip: Remove update-in-place-in-select from the internal SQL interpreter. It was only used for updating the InnoDB internal data dictionary when renaming or dropping tables. It could have caused deadlocks after acquiring latches on insert buffer bitmap pages. This and r3544 should fix Issue #135. Furthermore, the update-in-place-in-select does not account for compression failure. That was not a problem yet, since the InnoDB SQL interpreter has so far assumed ROW_FORMAT=REDUNDANT. rb://63 approved by Heikki Tuuri ------------------------------------------------------------------------
2008-12-17 13:48:23 +01:00
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
2005-10-27 09:29:40 +02:00
table->array = array;
table->n_cells = prime;
table->n_mutexes = 0;
table->mutexes = NULL;
table->heaps = NULL;
table->heap = NULL;
table->magic_n = HASH_TABLE_MAGIC_N;
2005-10-27 09:29:40 +02:00
/* Initialize the cell array */
hash_table_clear(table);
2005-10-27 09:29:40 +02:00
return(table);
}
/*****************************************************************
Frees a hash table. */
UNIV_INTERN
2005-10-27 09:29:40 +02:00
void
hash_table_free(
/*============*/
hash_table_t* table) /* in, own: hash table */
{
ut_a(table->mutexes == NULL);
ut_free(table->array);
mem_free(table);
}
/*****************************************************************
Creates a mutex array to protect a hash table. */
UNIV_INTERN
2005-10-27 09:29:40 +02:00
void
hash_create_mutexes_func(
/*=====================*/
2005-10-27 09:29:40 +02:00
hash_table_t* table, /* in: hash table */
#ifdef UNIV_SYNC_DEBUG
ulint sync_level, /* in: latching order level of the
2005-10-27 09:29:40 +02:00
mutexes: used in the debug version */
#endif /* UNIV_SYNC_DEBUG */
ulint n_mutexes) /* in: number of mutexes, must be a
power of 2 */
2005-10-27 09:29:40 +02:00
{
ulint i;
ut_a(n_mutexes > 0);
ut_a(ut_is_2pow(n_mutexes));
2005-10-27 09:29:40 +02:00
table->mutexes = mem_alloc(n_mutexes * sizeof(mutex_t));
for (i = 0; i < n_mutexes; i++) {
mutex_create(table->mutexes + i, sync_level);
2005-10-27 09:29:40 +02:00
}
table->n_mutexes = n_mutexes;
}