fis-gtm/sr_port/hashtab_mname.c

80 lines
2.7 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. *
* *
****************************************************************/
#include "mdef.h"
#include "min_max.h"
#include "gtm_string.h"
#include "error.h"
#include "send_msg.h"
#include "gtmmsg.h"
#include <rtnhdr.h>
#include "hashtab_mname.h"
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "alias.h"
GBLREF symval *curr_symval;
#define MNAME_HASH
/* The below include generates the hash table routines for the "mname" hash type */
#include "hashtab_implementation.h"
/* While the above include creates the bulk of the routines in this modules, for the mname hash type we
add one more routine that is a wrapper for the add_hashtab_mname created above. The situation this
wrapper (add_hashtab_mname_symval) covers is if the hash table was expanded, it goes back through the
stack and fixes the stack references kept in l_symval entries in each stackframe.
Note that there are currently no direct callers of expand_hashtab_mname() (except in op_view) that we
don't already protect or of delete_hashtab_mname() or they would need similar wrappers here.
*/
boolean_t add_hashtab_mname_symval(hash_table_mname *table, mname_entry *key, void *value, ht_ent_mname **tabentptr)
{
boolean_t retval;
int table_size_orig;
ht_ent_mname *table_base_orig;
/* Currently only two values we expect here shown below. If calls are added with other values, they need
to be taken care of here and in EXPAND_HASHTAB in hashtab_implementation.h
*/
assert(table == &curr_symval->h_symtab || table == &curr_symval->last_tab->h_symtab);
assert(FALSE == key->marked);
/* remember table we started with */
table_base_orig = table->base;
table_size_orig = table->size;
/* We'll do the base release once we do the reparations */
DEFER_BASE_REL_HASHTAB(table, TRUE);
/* Call real table function */
retval = add_hashtab_mname(table, key, value, tabentptr);
/* If the hash table has not changed, we are done */
if (table_base_orig == table->base)
{
DEFER_BASE_REL_HASHTAB(table, FALSE);
return retval;
}
/* Otherwise we have some work to do to repair the l_symtab entries in the stack */
als_lsymtab_repair(table, table_base_orig, table_size_orig);
/* We're done with the previous base */
FREE_BASE_HASHTAB(table, table_base_orig);
DEFER_BASE_REL_HASHTAB(table, FALSE);
return retval;
}