86 lines
3.3 KiB
C
86 lines
3.3 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2011 Fidelity Information Services, Inc *
|
|
* *
|
|
* This source code contains the intellectual property *
|
|
* of its copyright holder(s), and is made available *
|
|
* under a license. If you do not know the terms of *
|
|
* the license, please stop and do not read further. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
#ifndef __CWS_INSERT_H__
|
|
#define __CWS_INSERT_H__
|
|
|
|
GBLREF hash_table_int4 cw_stagnate;
|
|
GBLREF boolean_t cw_stagnate_reinitialized;
|
|
|
|
/* Usually a process does not need the cw_stagnate hash table as it is used only in the final retry.
|
|
* But CWS_RESET (to ensure the hashtable is reinitialized) is done in a lot of places and almost every transaction.
|
|
* To avoid unnecessary overhead in the reset, we start from a small initial value for CWS_INITIAL_SIZE.
|
|
* When necessary hash rounties will expand automatically.
|
|
*/
|
|
#define CWS_INITIAL_SIZE 4
|
|
|
|
/* Initialize the cw_stagnate hash-table */
|
|
#define CWS_INIT \
|
|
{ \
|
|
if (0 == cw_stagnate.size) \
|
|
{ \
|
|
init_hashtab_int4(&cw_stagnate, CWS_INITIAL_SIZE, HASHTAB_COMPACT, HASHTAB_SPARE_TABLE); \
|
|
cw_stagnate_reinitialized = TRUE; \
|
|
} \
|
|
}
|
|
|
|
/* macro CWS_INSERT appends a block_id onto an hashtable of block_id's
|
|
* cw_stagnate is the address of the hashtable
|
|
* it is initially NULL
|
|
* CWS_INITIAL_SIZE is the initial size of the hash table
|
|
* table is enlarged each time it fills up
|
|
* The hashtable is allocated the first time this routine is* called, and the contents of it are reset by calling cws_reset
|
|
* in t_begin, t_begin_crit and tp_hist. The hashtable expands by itself.
|
|
*/
|
|
|
|
GBLREF boolean_t mu_reorg_in_swap_blk;
|
|
GBLREF int4 cws_reorg_remove_index;
|
|
GBLREF block_id cws_reorg_remove_array[];
|
|
|
|
#define CWS_INSERT(block) \
|
|
{ \
|
|
ht_ent_int4 *dummy; \
|
|
boolean_t new_entry; \
|
|
\
|
|
cw_stagnate_reinitialized = FALSE; \
|
|
new_entry = add_hashtab_int4(&cw_stagnate, (uint4 *)(&block), HT_VALUE_DUMMY, &dummy); \
|
|
/* If in mu_swap_blk and a new entry was added to the hashtable, note this block number \
|
|
* in the cws_reorg_remove_array for later removal in the next iteration of the for \
|
|
* loop in "mu_swap_blk" (see mu_swap_blk.c for more detail). \
|
|
*/ \
|
|
if (mu_reorg_in_swap_blk && new_entry) \
|
|
{ \
|
|
CWS_REORG_INSERT(block); \
|
|
} \
|
|
}
|
|
|
|
#define CWS_REORG_REMOVE_ARRAYSIZE ((4 * MAX_BT_DEPTH) + 2) /* see mu_swap_blk.c for detail on this calculation */
|
|
#define CWS_REORG_REMOVE_MAXINDEX (CWS_REORG_REMOVE_ARRAYSIZE - 1)
|
|
|
|
#define CWS_REORG_INSERT(blk) \
|
|
{ \
|
|
assert(cws_reorg_remove_index < CWS_REORG_REMOVE_MAXINDEX); \
|
|
cws_reorg_remove_array[++cws_reorg_remove_index] = (blk); \
|
|
}
|
|
|
|
/* the use of the variable cw_stagnate_reinitialized to optimize CWS_RESET assumes that all calls to
|
|
* add_hashtab_int4() are done through CWS_INSERT macro.
|
|
*/
|
|
#define CWS_RESET \
|
|
{ /* if a transaction did not use cw_stagnate hash table, there is no need to reset it */ \
|
|
if (!cw_stagnate_reinitialized) \
|
|
{ \
|
|
reinitialize_hashtab_int4(&cw_stagnate); \
|
|
cw_stagnate_reinitialized = TRUE; \
|
|
} \
|
|
}
|
|
#endif
|