mariadb/include/ha0ha.h

242 lines
9 KiB
C
Raw Normal View History

2009-03-25 23:11:11 -07:00
/*****************************************************************************
Copyright (c) 1994, 2009, Innobase Oy. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
*****************************************************************************/
2009-09-07 10:22:53 +00:00
/**************************************************//**
@file include/ha0ha.h
The hash table with external chains
Created 8/18/1994 Heikki Tuuri
*******************************************************/
#ifndef ha0ha_h
#define ha0ha_h
#include "univ.i"
#include "hash0hash.h"
#include "page0types.h"
#include "buf0types.h"
2009-09-07 10:22:53 +00:00
/*************************************************************//**
Looks for an element in a hash table.
@return pointer to the data of the first hash table node in chain
having the fold number, NULL if not found */
UNIV_INLINE
void*
ha_search_and_get_data(
/*===================*/
2009-09-07 10:22:53 +00:00
hash_table_t* table, /*!< in: hash table */
ulint fold); /*!< in: folded value of the searched data */
/*********************************************************//**
Looks for an element when we know the pointer to the data and updates
the pointer to data if found. */
UNIV_INTERN
void
ha_search_and_update_if_found_func(
/*===============================*/
2009-09-07 10:22:53 +00:00
hash_table_t* table, /*!< in/out: hash table */
ulint fold, /*!< in: folded value of the searched data */
void* data, /*!< in: pointer to the data */
2009-03-25 23:11:11 -07:00
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
2009-09-07 10:22:53 +00:00
buf_block_t* new_block,/*!< in: block containing new_data */
2009-03-25 23:11:11 -07:00
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
2009-09-07 10:22:53 +00:00
void* new_data);/*!< in: new pointer to the data */
2009-03-25 23:11:11 -07:00
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
2009-09-07 10:22:53 +00:00
/** Looks for an element when we know the pointer to the data and
updates the pointer to data if found.
@param table in/out: hash table
@param fold in: folded value of the searched data
@param data in: pointer to the data
@param new_block in: block containing new_data
@param new_data in: new pointer to the data */
# define ha_search_and_update_if_found(table,fold,data,new_block,new_data) \
ha_search_and_update_if_found_func(table,fold,data,new_block,new_data)
2009-03-25 23:11:11 -07:00
#else /* UNIV_AHI_DEBUG || UNIV_DEBUG */
2009-09-07 10:22:53 +00:00
/** Looks for an element when we know the pointer to the data and
updates the pointer to data if found.
@param table in/out: hash table
@param fold in: folded value of the searched data
@param data in: pointer to the data
@param new_block ignored: block containing new_data
@param new_data in: new pointer to the data */
# define ha_search_and_update_if_found(table,fold,data,new_block,new_data) \
ha_search_and_update_if_found_func(table,fold,data,new_data)
2009-03-25 23:11:11 -07:00
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
2009-09-07 10:22:53 +00:00
/*************************************************************//**
Creates a hash table with at least n array cells. The actual number
of cells is chosen to be a prime number slightly bigger than n.
@return own: created table */
UNIV_INTERN
hash_table_t*
ha_create_func(
/*===========*/
2009-09-07 10:22:53 +00:00
ulint n, /*!< in: number of array cells */
#ifdef UNIV_SYNC_DEBUG
2009-09-07 10:22:53 +00:00
ulint mutex_level, /*!< in: level of the mutexes in the latching
order: this is used in the debug version */
#endif /* UNIV_SYNC_DEBUG */
2009-09-07 10:22:53 +00:00
ulint n_mutexes); /*!< in: number of mutexes to protect the
hash table: must be a power of 2, or 0 */
#ifdef UNIV_SYNC_DEBUG
2009-09-07 10:22:53 +00:00
/** Creates a hash table.
@return own: created table
@param n_c in: number of array cells. The actual number of cells is
chosen to be a slightly bigger prime number.
@param level in: level of the mutexes in the latching order
@param n_m in: number of mutexes to protect the hash table;
must be a power of 2, or 0 */
# define ha_create(n_c,n_m,level) ha_create_func(n_c,level,n_m)
#else /* UNIV_SYNC_DEBUG */
2009-09-07 10:22:53 +00:00
/** Creates a hash table.
@return own: created table
@param n_c in: number of array cells. The actual number of cells is
chosen to be a slightly bigger prime number.
@param level in: level of the mutexes in the latching order
@param n_m in: number of mutexes to protect the hash table;
must be a power of 2, or 0 */
# define ha_create(n_c,n_m,level) ha_create_func(n_c,n_m)
#endif /* UNIV_SYNC_DEBUG */
2009-09-07 10:22:53 +00:00
/*************************************************************//**
Empties a hash table and frees the memory heaps. */
UNIV_INTERN
void
ha_clear(
/*=====*/
2009-09-07 10:22:53 +00:00
hash_table_t* table); /*!< in, own: hash table */
2009-09-07 10:22:53 +00:00
/*************************************************************//**
Inserts an entry into a hash table. If an entry with the same fold number
is found, its node is updated to point to the new data, and no new node
2009-09-07 10:22:53 +00:00
is inserted.
@return TRUE if succeed, FALSE if no more memory could be allocated */
UNIV_INTERN
ibool
ha_insert_for_fold_func(
/*====================*/
2009-09-07 10:22:53 +00:00
hash_table_t* table, /*!< in: hash table */
ulint fold, /*!< in: folded value of data; if a node with
the same fold value already exists, it is
updated to point to the same data, and no new
node is created! */
2009-03-25 23:11:11 -07:00
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
2009-09-07 10:22:53 +00:00
buf_block_t* block, /*!< in: buffer block containing the data */
2009-03-25 23:11:11 -07:00
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
2009-09-07 10:22:53 +00:00
void* data); /*!< in: data, must not be NULL */
2009-03-25 23:11:11 -07:00
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
2009-09-07 10:22:53 +00:00
/**
Inserts an entry into a hash table. If an entry with the same fold number
is found, its node is updated to point to the new data, and no new node
is inserted.
@return TRUE if succeed, FALSE if no more memory could be allocated
@param t in: hash table
@param f in: folded value of data
@param b in: buffer block containing the data
@param d in: data, must not be NULL */
# define ha_insert_for_fold(t,f,b,d) ha_insert_for_fold_func(t,f,b,d)
2009-03-25 23:11:11 -07:00
#else /* UNIV_AHI_DEBUG || UNIV_DEBUG */
2009-09-07 10:22:53 +00:00
/**
Inserts an entry into a hash table. If an entry with the same fold number
is found, its node is updated to point to the new data, and no new node
is inserted.
@return TRUE if succeed, FALSE if no more memory could be allocated
@param t in: hash table
@param f in: folded value of data
@param b ignored: buffer block containing the data
@param d in: data, must not be NULL */
# define ha_insert_for_fold(t,f,b,d) ha_insert_for_fold_func(t,f,d)
2009-03-25 23:11:11 -07:00
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
2009-09-07 10:22:53 +00:00
/*********************************************************//**
Looks for an element when we know the pointer to the data and deletes
2009-09-07 10:22:53 +00:00
it from the hash table if found.
@return TRUE if found */
UNIV_INLINE
ibool
ha_search_and_delete_if_found(
/*==========================*/
2009-09-07 10:22:53 +00:00
hash_table_t* table, /*!< in: hash table */
ulint fold, /*!< in: folded value of the searched data */
void* data); /*!< in: pointer to the data */
#ifndef UNIV_HOTBACKUP
/*****************************************************************//**
Removes from the chain determined by fold all nodes whose data pointer
points to the page given. */
UNIV_INTERN
void
ha_remove_all_nodes_to_page(
/*========================*/
2009-09-07 10:22:53 +00:00
hash_table_t* table, /*!< in: hash table */
ulint fold, /*!< in: fold value */
const page_t* page); /*!< in: buffer page */
/*************************************************************//**
Validates a given range of the cells in hash table.
@return TRUE if ok */
UNIV_INTERN
ibool
ha_validate(
/*========*/
2009-09-07 10:22:53 +00:00
hash_table_t* table, /*!< in: hash table */
ulint start_index, /*!< in: start index */
ulint end_index); /*!< in: end index */
/*************************************************************//**
Prints info of a hash table. */
UNIV_INTERN
void
ha_print_info(
/*==========*/
2009-09-07 10:22:53 +00:00
FILE* file, /*!< in: file where to print */
hash_table_t* table); /*!< in: hash table */
#endif /* !UNIV_HOTBACKUP */
2009-09-07 10:22:53 +00:00
/** The hash table external chain node */
typedef struct ha_node_struct ha_node_t;
2009-09-07 10:22:53 +00:00
/** The hash table external chain node */
struct ha_node_struct {
2009-09-07 10:22:53 +00:00
ha_node_t* next; /*!< next chain node or NULL if none */
2009-03-25 23:11:11 -07:00
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
2009-09-07 10:22:53 +00:00
buf_block_t* block; /*!< buffer block containing the data, or NULL */
2009-03-25 23:11:11 -07:00
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
2009-09-07 10:22:53 +00:00
void* data; /*!< pointer to the data */
ulint fold; /*!< fold value for the data */
};
2009-09-07 10:22:53 +00:00
#ifndef UNIV_HOTBACKUP
/** Assert that the current thread is holding the mutex protecting a
hash bucket corresponding to a fold value.
@param table in: hash table
@param fold in: fold value */
# define ASSERT_HASH_MUTEX_OWN(table, fold) \
ut_ad(!(table)->mutexes || mutex_own(hash_get_mutex(table, fold)))
#else /* !UNIV_HOTBACKUP */
/** Assert that the current thread is holding the mutex protecting a
hash bucket corresponding to a fold value.
@param table in: hash table
@param fold in: fold value */
# define ASSERT_HASH_MUTEX_OWN(table, fold) ((void) 0)
#endif /* !UNIV_HOTBACKUP */
#ifndef UNIV_NONINL
#include "ha0ha.ic"
#endif
#endif