74 lines
2.3 KiB
C
74 lines
2.3 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2003, 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. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
#include "mdef.h"
|
|
|
|
#include "error.h"
|
|
#include "gdsroot.h"
|
|
#include "gdsblk.h"
|
|
#include "gdsbt.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsfhead.h"
|
|
#include "filestruct.h"
|
|
#include "jnl.h"
|
|
#include "hashtab_int4.h"
|
|
#include "hashtab_int8.h"
|
|
#include "hashtab_mname.h"
|
|
#include "buddy_list.h"
|
|
#include "muprec.h"
|
|
|
|
GBLREF mur_gbls_t murgbl;
|
|
#define MUR_ENOUGH_COMPLETE_TRANS(MURGBL) ((MURGBL).broken_cnt <= ((MURGBL).token_table.count >> 2)) /* 75% resolved completely */
|
|
|
|
void mur_multi_rehash(void)
|
|
{
|
|
multi_struct *multi, *next_multi;
|
|
hash_table_int8 temp_table;
|
|
ht_ent_int8 *newent, *curent, *topent;
|
|
DEBUG_ONLY(int brkn_cnt;)
|
|
|
|
/* see if re-hashing of broken entries can reduce the size of the hash-table leading to faster processing times */
|
|
if (MUR_ENOUGH_COMPLETE_TRANS(murgbl)) /* are enough entries fully resolved to justify cost of re-hashing? */
|
|
{ /* re-hash broken entries */
|
|
DEBUG_ONLY(brkn_cnt = 0;)
|
|
ESTABLISH(hashtab_rehash_ch);
|
|
/* enough size to acommodate broken transactions */
|
|
init_hashtab_int8(&temp_table, murgbl.broken_cnt * 100.0 / HT_LOAD_FACTOR, HASHTAB_COMPACT, HASHTAB_SPARE_TABLE);
|
|
REVERT;
|
|
for (curent = murgbl.token_table.base, topent = murgbl.token_table.top; curent < topent; curent++)
|
|
{
|
|
if (HTENT_VALID_INT8(curent, multi_struct, multi))
|
|
{
|
|
for (next_multi = multi; NULL != next_multi; multi = next_multi)
|
|
{
|
|
next_multi = (multi_struct *)multi->next;
|
|
if (0 < multi->partner) /* re-hash only broken transactions */
|
|
{
|
|
multi->next = NULL;
|
|
if (!add_hashtab_int8(&temp_table, &multi->token, multi, &newent))
|
|
{
|
|
assert(NULL != newent->value);
|
|
multi->next = (multi_struct *)newent->value;
|
|
newent->value = (char *)multi;
|
|
}
|
|
DEBUG_ONLY(brkn_cnt++;)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
free_hashtab_int8(&murgbl.token_table);
|
|
murgbl.token_table = temp_table;
|
|
assert(brkn_cnt == murgbl.broken_cnt);
|
|
}
|
|
return;
|
|
}
|