Format sources

pull/475/head
Artem Gavrilov 2024-07-17 18:38:43 +02:00
parent c8f2dea0c1
commit 6ef992d9f0
4 changed files with 63 additions and 62 deletions

2
guc.c
View File

@ -48,7 +48,7 @@ static bool check_overflow_targer(int *newval, void **extra, GucSource source);
void void
init_guc(void) init_guc(void)
{ {
pgsm_track = PGSM_TRACK_TOP; pgsm_track = PGSM_TRACK_TOP;
DefineCustomIntVariable("pg_stat_monitor.pgsm_max", /* name */ DefineCustomIntVariable("pg_stat_monitor.pgsm_max", /* name */
"Sets the maximum size of shared memory in (MB) used for statement's metadata tracked by pg_stat_monitor.", /* short_desc */ "Sets the maximum size of shared memory in (MB) used for statement's metadata tracked by pg_stat_monitor.", /* short_desc */

View File

@ -19,9 +19,9 @@
#include "pg_stat_monitor.h" #include "pg_stat_monitor.h"
static pgsmLocalState pgsmStateLocal; static pgsmLocalState pgsmStateLocal;
static PGSM_HASH_TABLE_HANDLE pgsm_create_bucket_hash(pgsmSharedState * pgsm, dsa_area *dsa); static PGSM_HASH_TABLE_HANDLE pgsm_create_bucket_hash(pgsmSharedState *pgsm, dsa_area *dsa);
static Size pgsm_get_shared_area_size(void); static Size pgsm_get_shared_area_size(void);
static void InitializeSharedState(pgsmSharedState * pgsm); static void InitializeSharedState(pgsmSharedState *pgsm);
#define PGSM_BUCKET_INFO_SIZE (sizeof(TimestampTz) * pgsm_max_buckets) #define PGSM_BUCKET_INFO_SIZE (sizeof(TimestampTz) * pgsm_max_buckets)
#define PGSM_SHARED_STATE_SIZE (sizeof(pgsmSharedState) + PGSM_BUCKET_INFO_SIZE) #define PGSM_SHARED_STATE_SIZE (sizeof(pgsmSharedState) + PGSM_BUCKET_INFO_SIZE)
@ -142,9 +142,9 @@ pgsm_startup(void)
*/ */
dsa_detach(dsa); dsa_detach(dsa);
pgsmStateLocal.pgsm_mem_cxt = AllocSetContextCreate(TopMemoryContext, pgsmStateLocal.pgsm_mem_cxt = AllocSetContextCreate(TopMemoryContext,
"pg_stat_monitor local store", "pg_stat_monitor local store",
ALLOCSET_DEFAULT_SIZES); ALLOCSET_DEFAULT_SIZES);
} }
#ifdef BENCHMARK #ifdef BENCHMARK
@ -161,7 +161,7 @@ pgsm_startup(void)
} }
static void static void
InitializeSharedState(pgsmSharedState * pgsm) InitializeSharedState(pgsmSharedState *pgsm)
{ {
pg_atomic_init_u64(&pgsm->current_wbucket, 0); pg_atomic_init_u64(&pgsm->current_wbucket, 0);
pg_atomic_init_u64(&pgsm->prev_bucket_sec, 0); pg_atomic_init_u64(&pgsm->prev_bucket_sec, 0);
@ -172,7 +172,7 @@ InitializeSharedState(pgsmSharedState * pgsm)
* Create the classic or dshahs hash table for storing the query statistics. * Create the classic or dshahs hash table for storing the query statistics.
*/ */
static PGSM_HASH_TABLE_HANDLE static PGSM_HASH_TABLE_HANDLE
pgsm_create_bucket_hash(pgsmSharedState * pgsm, dsa_area *dsa) pgsm_create_bucket_hash(pgsmSharedState *pgsm, dsa_area *dsa)
{ {
PGSM_HASH_TABLE_HANDLE bucket_hash; PGSM_HASH_TABLE_HANDLE bucket_hash;
@ -238,7 +238,8 @@ pgsm_attach_shmem(void)
MemoryContextSwitchTo(oldcontext); MemoryContextSwitchTo(oldcontext);
} }
MemoryContext GetPgsmMemoryContext(void) MemoryContext
GetPgsmMemoryContext(void)
{ {
return pgsmStateLocal.pgsm_mem_cxt; return pgsmStateLocal.pgsm_mem_cxt;
} }
@ -287,7 +288,7 @@ pgsm_shmem_shutdown(int code, Datum arg)
} }
pgsmEntry * pgsmEntry *
hash_entry_alloc(pgsmSharedState * pgsm, pgsmHashKey * key, int encoding) hash_entry_alloc(pgsmSharedState *pgsm, pgsmHashKey *key, int encoding)
{ {
pgsmEntry *entry = NULL; pgsmEntry *entry = NULL;
bool found = false; bool found = false;
@ -391,7 +392,7 @@ IsSystemOOM(void)
*/ */
void * void *
pgsm_hash_find_or_insert(PGSM_HASH_TABLE * shared_hash, pgsmHashKey * key, bool *found) pgsm_hash_find_or_insert(PGSM_HASH_TABLE * shared_hash, pgsmHashKey *key, bool *found)
{ {
#if USE_DYNAMIC_HASH #if USE_DYNAMIC_HASH
void *entry; void *entry;
@ -404,7 +405,7 @@ pgsm_hash_find_or_insert(PGSM_HASH_TABLE * shared_hash, pgsmHashKey * key, bool
} }
void * void *
pgsm_hash_find(PGSM_HASH_TABLE * shared_hash, pgsmHashKey * key, bool *found) pgsm_hash_find(PGSM_HASH_TABLE * shared_hash, pgsmHashKey *key, bool *found)
{ {
#if USE_DYNAMIC_HASH #if USE_DYNAMIC_HASH
return dshash_find(shared_hash, key, false); return dshash_find(shared_hash, key, false);

View File

@ -32,7 +32,7 @@ typedef enum pgsmVersion
{ {
PGSM_V1_0 = 0, PGSM_V1_0 = 0,
PGSM_V2_0 PGSM_V2_0
} pgsmVersion; } pgsmVersion;
PG_MODULE_MAGIC; PG_MODULE_MAGIC;
@ -202,9 +202,9 @@ char *unpack_sql_state(int sql_state);
!IsA(n, DeallocateStmt)) !IsA(n, DeallocateStmt))
static pgsmEntry * pgsm_create_hash_entry(uint64 bucket_id, uint64 queryid, PlanInfo * plan_info); static pgsmEntry *pgsm_create_hash_entry(uint64 bucket_id, uint64 queryid, PlanInfo *plan_info);
static void pgsm_add_to_list(pgsmEntry * entry, char *query_text, int query_len); static void pgsm_add_to_list(pgsmEntry *entry, char *query_text, int query_len);
static pgsmEntry * pgsm_get_entry_for_query(uint64 queryid, PlanInfo * plan_info, const char *query_text, int query_len, bool create); static pgsmEntry *pgsm_get_entry_for_query(uint64 queryid, PlanInfo *plan_info, const char *query_text, int query_len, bool create);
static uint64 get_pgsm_query_id_hash(const char *norm_query, int len); static uint64 get_pgsm_query_id_hash(const char *norm_query, int len);
static void pgsm_cleanup_callback(void *arg); static void pgsm_cleanup_callback(void *arg);
@ -218,13 +218,13 @@ MemoryContextCallback mem_cxt_reset_callback =
}; };
volatile bool callback_setup = false; volatile bool callback_setup = false;
static void pgsm_update_entry(pgsmEntry * entry, static void pgsm_update_entry(pgsmEntry *entry,
const char *query, const char *query,
char *comments, char *comments,
int comments_len, int comments_len,
PlanInfo * plan_info, PlanInfo *plan_info,
SysInfo * sys_info, SysInfo *sys_info,
ErrorInfo * error_info, ErrorInfo *error_info,
double plan_total_time, double plan_total_time,
double exec_total_time, double exec_total_time,
uint64 rows, uint64 rows,
@ -233,7 +233,7 @@ static void pgsm_update_entry(pgsmEntry * entry,
const struct JitInstrumentation *jitusage, const struct JitInstrumentation *jitusage,
bool reset, bool reset,
pgsmStoreKind kind); pgsmStoreKind kind);
static void pgsm_store(pgsmEntry * entry); static void pgsm_store(pgsmEntry *entry);
static void pg_stat_monitor_internal(FunctionCallInfo fcinfo, static void pg_stat_monitor_internal(FunctionCallInfo fcinfo,
pgsmVersion api_version, pgsmVersion api_version,
@ -260,7 +260,7 @@ static char *generate_normalized_query(JumbleState *jstate, const char *query,
static void fill_in_constant_lengths(JumbleState *jstate, const char *query, int query_loc); static void fill_in_constant_lengths(JumbleState *jstate, const char *query, int query_loc);
static int comp_location(const void *a, const void *b); static int comp_location(const void *a, const void *b);
static uint64 get_next_wbucket(pgsmSharedState * pgsm); static uint64 get_next_wbucket(pgsmSharedState *pgsm);
/* /*
* Module load callback * Module load callback
@ -696,7 +696,7 @@ pgsm_ExecutorEnd(QueryDesc *queryDesc)
/* Extract the plan information in case of SELECT statement */ /* Extract the plan information in case of SELECT statement */
if (queryDesc->operation == CMD_SELECT && pgsm_enable_query_plan) if (queryDesc->operation == CMD_SELECT && pgsm_enable_query_plan)
{ {
int rv; int rv;
MemoryContext oldctx; MemoryContext oldctx;
/* /*
@ -806,9 +806,9 @@ pgsm_ExecutorCheckPerms(List *rt, List *rp, bool abort)
if (rte->rtekind != RTE_RELATION if (rte->rtekind != RTE_RELATION
#if PG_VERSION_NUM >= 160000 #if PG_VERSION_NUM >= 160000
&& (rte->rtekind != RTE_SUBQUERY && rte->relkind != 'v') && (rte->rtekind != RTE_SUBQUERY && rte->relkind != 'v')
#endif #endif
) )
continue; continue;
if (i < REL_LST) if (i < REL_LST)
@ -1336,13 +1336,13 @@ pg_get_client_addr(bool *ok)
} }
static void static void
pgsm_update_entry(pgsmEntry * entry, pgsm_update_entry(pgsmEntry *entry,
const char *query, const char *query,
char *comments, char *comments,
int comments_len, int comments_len,
PlanInfo * plan_info, PlanInfo *plan_info,
SysInfo * sys_info, SysInfo *sys_info,
ErrorInfo * error_info, ErrorInfo *error_info,
double plan_total_time, double plan_total_time,
double exec_total_time, double exec_total_time,
uint64 rows, uint64 rows,
@ -1364,7 +1364,7 @@ pgsm_update_entry(pgsmEntry * entry,
/* volatile block */ /* volatile block */
{ {
volatile pgsmEntry *e = (volatile pgsmEntry *) entry; volatile pgsmEntry *e = (volatile pgsmEntry *) entry;
if (kind == PGSM_STORE) if (kind == PGSM_STORE)
SpinLockAcquire(&e->mutex); SpinLockAcquire(&e->mutex);
@ -1462,7 +1462,7 @@ pgsm_update_entry(pgsmEntry * entry,
if (exec_nested_level >= 0 && exec_nested_level < max_stack_depth) if (exec_nested_level >= 0 && exec_nested_level < max_stack_depth)
{ {
int parent_query_len = nested_query_txts[exec_nested_level - 1] ? int parent_query_len = nested_query_txts[exec_nested_level - 1] ?
strlen(nested_query_txts[exec_nested_level - 1]) : 0; strlen(nested_query_txts[exec_nested_level - 1]) : 0;
e->counters.info.parentid = nested_queryids[exec_nested_level - 1]; e->counters.info.parentid = nested_queryids[exec_nested_level - 1];
e->counters.info.parent_query = InvalidDsaPointer; e->counters.info.parent_query = InvalidDsaPointer;
@ -1606,7 +1606,7 @@ pgsm_store_error(const char *query, ErrorData *edata)
} }
static void static void
pgsm_add_to_list(pgsmEntry * entry, char *query_text, int query_len) pgsm_add_to_list(pgsmEntry *entry, char *query_text, int query_len)
{ {
/* Switch to pgsm memory context */ /* Switch to pgsm memory context */
MemoryContext oldctx = MemoryContextSwitchTo(GetPgsmMemoryContext()); MemoryContext oldctx = MemoryContextSwitchTo(GetPgsmMemoryContext());
@ -1617,7 +1617,7 @@ pgsm_add_to_list(pgsmEntry * entry, char *query_text, int query_len)
} }
static pgsmEntry * static pgsmEntry *
pgsm_get_entry_for_query(uint64 queryid, PlanInfo * plan_info, const char *query_text, int query_len, bool create) pgsm_get_entry_for_query(uint64 queryid, PlanInfo *plan_info, const char *query_text, int query_len, bool create)
{ {
pgsmEntry *entry = NULL; pgsmEntry *entry = NULL;
ListCell *lc = NULL; ListCell *lc = NULL;
@ -1675,7 +1675,7 @@ pgsm_cleanup_callback(void *arg)
* The bucket_id may not be known at this stage. So pass any value that you may wish. * The bucket_id may not be known at this stage. So pass any value that you may wish.
*/ */
static pgsmEntry * static pgsmEntry *
pgsm_create_hash_entry(uint64 bucket_id, uint64 queryid, PlanInfo * plan_info) pgsm_create_hash_entry(uint64 bucket_id, uint64 queryid, PlanInfo *plan_info)
{ {
pgsmEntry *entry; pgsmEntry *entry;
int sec_ctx; int sec_ctx;
@ -1754,7 +1754,7 @@ pgsm_create_hash_entry(uint64 bucket_id, uint64 queryid, PlanInfo * plan_info)
* query string. total_time, rows, bufusage are ignored in this case. * query string. total_time, rows, bufusage are ignored in this case.
*/ */
static void static void
pgsm_store(pgsmEntry * entry) pgsm_store(pgsmEntry *entry)
{ {
pgsmEntry *shared_hash_entry; pgsmEntry *shared_hash_entry;
pgsmSharedState *pgsm; pgsmSharedState *pgsm;
@ -1895,9 +1895,9 @@ pgsm_store(pgsmEntry * entry)
{ {
ereport(WARNING, ereport(WARNING,
(errcode(ERRCODE_OUT_OF_MEMORY), (errcode(ERRCODE_OUT_OF_MEMORY),
errmsg("[pg_stat_monitor] pgsm_store: Hash table is out of memory and can no longer store queries!"), errmsg("[pg_stat_monitor] pgsm_store: Hash table is out of memory and can no longer store queries!"),
errdetail("You may reset the view or when the buckets are deallocated, pg_stat_monitor will resume saving " \ errdetail("You may reset the view or when the buckets are deallocated, pg_stat_monitor will resume saving " \
"queries. Alternatively, try increasing the value of pg_stat_monitor.pgsm_max."))); "queries. Alternatively, try increasing the value of pg_stat_monitor.pgsm_max.")));
} PGSM_END_DISABLE_ERROR_CAPTURE(); } PGSM_END_DISABLE_ERROR_CAPTURE();
} }
@ -1999,7 +1999,7 @@ IsBucketValid(uint64 bucketid)
TimestampDifference(pgsm->bucket_start_time[bucketid], current_tz, &secs, &microsecs); TimestampDifference(pgsm->bucket_start_time[bucketid], current_tz, &secs, &microsecs);
if (secs > ((int64)pgsm_bucket_time * pgsm_max_buckets)) if (secs > ((int64) pgsm_bucket_time * pgsm_max_buckets))
return false; return false;
return true; return true;
} }
@ -2111,7 +2111,7 @@ pg_stat_monitor_internal(FunctionCallInfo fcinfo,
/* copy counters to a local variable to keep locking time short */ /* copy counters to a local variable to keep locking time short */
{ {
volatile pgsmEntry *e = (volatile pgsmEntry *) entry; volatile pgsmEntry *e = (volatile pgsmEntry *) entry;
SpinLockAcquire(&e->mutex); SpinLockAcquire(&e->mutex);
tmp = e->counters; tmp = e->counters;
@ -2426,7 +2426,7 @@ pg_stat_monitor_internal(FunctionCallInfo fcinfo,
} }
static uint64 static uint64
get_next_wbucket(pgsmSharedState * pgsm) get_next_wbucket(pgsmSharedState *pgsm)
{ {
struct timeval tv; struct timeval tv;
uint64 current_bucket_sec; uint64 current_bucket_sec;

View File

@ -195,7 +195,7 @@ typedef enum pgsmStoreKind
PGSM_ERROR, PGSM_ERROR,
PGSM_NUMKIND /* Must be last value of this enum */ PGSM_NUMKIND /* Must be last value of this enum */
} pgsmStoreKind; } pgsmStoreKind;
/* the assumption of query max nested level */ /* the assumption of query max nested level */
#define DEFAULT_MAX_NESTED_LEVEL 10 #define DEFAULT_MAX_NESTED_LEVEL 10
@ -208,7 +208,7 @@ typedef enum AGG_KEY
AGG_KEY_DATABASE = 0, AGG_KEY_DATABASE = 0,
AGG_KEY_USER, AGG_KEY_USER,
AGG_KEY_HOST AGG_KEY_HOST
} AGG_KEY; } AGG_KEY;
#define MAX_QUERY_LEN 1024 #define MAX_QUERY_LEN 1024
@ -220,7 +220,7 @@ typedef struct CallTime
double max_time; /* maximum execution time in msec */ double max_time; /* maximum execution time in msec */
double mean_time; /* mean execution time in msec */ double mean_time; /* mean execution time in msec */
double sum_var_time; /* sum of variances in execution time in msec */ double sum_var_time; /* sum of variances in execution time in msec */
} CallTime; } CallTime;
typedef struct PlanInfo typedef struct PlanInfo
@ -228,7 +228,7 @@ typedef struct PlanInfo
uint64 planid; /* plan identifier */ uint64 planid; /* plan identifier */
char plan_text[PLAN_TEXT_LEN]; /* plan text */ char plan_text[PLAN_TEXT_LEN]; /* plan text */
size_t plan_len; /* strlen(plan_text) */ size_t plan_len; /* strlen(plan_text) */
} PlanInfo; } PlanInfo;
typedef struct pgsmHashKey typedef struct pgsmHashKey
{ {
@ -240,7 +240,7 @@ typedef struct pgsmHashKey
Oid dbid; /* database OID */ Oid dbid; /* database OID */
uint32 ip; /* client ip address */ uint32 ip; /* client ip address */
bool toplevel; /* query executed at top level */ bool toplevel; /* query executed at top level */
} pgsmHashKey; } pgsmHashKey;
typedef struct QueryInfo typedef struct QueryInfo
{ {
@ -262,14 +262,14 @@ typedef struct ErrorInfo
int64 elevel; /* error elevel */ int64 elevel; /* error elevel */
char sqlcode[SQLCODE_LEN]; /* error sqlcode */ char sqlcode[SQLCODE_LEN]; /* error sqlcode */
char message[ERROR_MESSAGE_LEN]; /* error message text */ char message[ERROR_MESSAGE_LEN]; /* error message text */
} ErrorInfo; } ErrorInfo;
typedef struct Calls typedef struct Calls
{ {
int64 calls; /* # of times executed */ int64 calls; /* # of times executed */
int64 rows; /* total # of retrieved or affected rows */ int64 rows; /* total # of retrieved or affected rows */
double usage; /* usage factor */ double usage; /* usage factor */
} Calls; } Calls;
typedef struct Blocks typedef struct Blocks
@ -299,7 +299,7 @@ typedef struct Blocks
instr_time instr_blk_write_time; /* time spent writing blocks */ instr_time instr_blk_write_time; /* time spent writing blocks */
instr_time instr_temp_blk_read_time; /* time spent reading temp blocks */ instr_time instr_temp_blk_read_time; /* time spent reading temp blocks */
instr_time instr_temp_blk_write_time; /* time spent writing temp blocks */ instr_time instr_temp_blk_write_time; /* time spent writing temp blocks */
} Blocks; } Blocks;
typedef struct JitInfo typedef struct JitInfo
{ {
@ -323,20 +323,20 @@ typedef struct JitInfo
instr_time instr_inlining_counter; /* inlining counter */ instr_time instr_inlining_counter; /* inlining counter */
instr_time instr_optimization_counter; /* optimization counter */ instr_time instr_optimization_counter; /* optimization counter */
instr_time instr_emission_counter; /* emission counter */ instr_time instr_emission_counter; /* emission counter */
} JitInfo; } JitInfo;
typedef struct SysInfo typedef struct SysInfo
{ {
double utime; /* user cpu time */ double utime; /* user cpu time */
double stime; /* system cpu time */ double stime; /* system cpu time */
} SysInfo; } SysInfo;
typedef struct Wal_Usage typedef struct Wal_Usage
{ {
int64 wal_records; /* # of WAL records generated */ int64 wal_records; /* # of WAL records generated */
int64 wal_fpi; /* # of WAL full page images generated */ int64 wal_fpi; /* # of WAL full page images generated */
uint64 wal_bytes; /* total amount of WAL bytes generated */ uint64 wal_bytes; /* total amount of WAL bytes generated */
} Wal_Usage; } Wal_Usage;
typedef struct Counters typedef struct Counters
{ {
@ -376,7 +376,7 @@ typedef struct pgsmEntry
dsa_pointer query_pos; /* query location within query buffer */ dsa_pointer query_pos; /* query location within query buffer */
char *query_pointer; char *query_pointer;
} query_text; } query_text;
} pgsmEntry; } pgsmEntry;
/* /*
* Global shared state * Global shared state
@ -399,8 +399,8 @@ typedef struct pgsmSharedState
*/ */
bool pgsm_oom; bool pgsm_oom;
TimestampTz bucket_start_time[]; /* start time of the bucket */ TimestampTz bucket_start_time[]; /* start time of the bucket */
} pgsmSharedState; } pgsmSharedState;
typedef struct pgsmLocalState typedef struct pgsmLocalState
{ {
@ -408,9 +408,9 @@ typedef struct pgsmLocalState
dsa_area *dsa; /* local dsa area for backend attached to the dsa_area *dsa; /* local dsa area for backend attached to the
* dsa area created by postmaster at startup. */ * dsa area created by postmaster at startup. */
PGSM_HASH_TABLE *shared_hash; PGSM_HASH_TABLE *shared_hash;
MemoryContext pgsm_mem_cxt; MemoryContext pgsm_mem_cxt;
} pgsmLocalState; } pgsmLocalState;
#if PG_VERSION_NUM < 140000 #if PG_VERSION_NUM < 140000
/* /*
@ -465,7 +465,7 @@ pgsmSharedState *pgsm_get_ss(void);
void hash_query_entries(); void hash_query_entries();
void hash_query_entry_dealloc(int new_bucket_id, int old_bucket_id, unsigned char *query_buffer[]); void hash_query_entry_dealloc(int new_bucket_id, int old_bucket_id, unsigned char *query_buffer[]);
void hash_entry_dealloc(int new_bucket_id, int old_bucket_id, unsigned char *query_buffer); void hash_entry_dealloc(int new_bucket_id, int old_bucket_id, unsigned char *query_buffer);
pgsmEntry *hash_entry_alloc(pgsmSharedState * pgsm, pgsmHashKey * key, int encoding); pgsmEntry *hash_entry_alloc(pgsmSharedState *pgsm, pgsmHashKey *key, int encoding);
Size pgsm_ShmemSize(void); Size pgsm_ShmemSize(void);
void pgsm_startup(void); void pgsm_startup(void);
@ -483,7 +483,7 @@ typedef enum
PSGM_TRACK_NONE = 0, /* track no statements */ PSGM_TRACK_NONE = 0, /* track no statements */
PGSM_TRACK_TOP, /* only top level statements */ PGSM_TRACK_TOP, /* only top level statements */
PGSM_TRACK_ALL /* all statements, including nested ones */ PGSM_TRACK_ALL /* all statements, including nested ones */
} PGSMTrackLevel; } PGSMTrackLevel;
static const struct config_enum_entry track_options[] = static const struct config_enum_entry track_options[] =
{ {
{"none", PSGM_TRACK_NONE, false}, {"none", PSGM_TRACK_NONE, false},
@ -497,7 +497,7 @@ typedef enum
HISTOGRAM_START, HISTOGRAM_START,
HISTOGRAM_END, HISTOGRAM_END,
HISTOGRAM_COUNT HISTOGRAM_COUNT
} HistogramTimingType; } HistogramTimingType;
extern int pgsm_max; extern int pgsm_max;
extern int pgsm_query_max_len; extern int pgsm_query_max_len;
@ -522,8 +522,8 @@ extern int pgsm_track;
#define HOOK_STATS_SIZE 0 #define HOOK_STATS_SIZE 0
#endif #endif
void *pgsm_hash_find_or_insert(PGSM_HASH_TABLE * shared_hash, pgsmHashKey * key, bool *found); void *pgsm_hash_find_or_insert(PGSM_HASH_TABLE * shared_hash, pgsmHashKey *key, bool *found);
void *pgsm_hash_find(PGSM_HASH_TABLE * shared_hash, pgsmHashKey * key, bool *found); void *pgsm_hash_find(PGSM_HASH_TABLE * shared_hash, pgsmHashKey *key, bool *found);
void pgsm_hash_seq_init(PGSM_HASH_SEQ_STATUS * hstat, PGSM_HASH_TABLE * shared_hash, bool lock); void pgsm_hash_seq_init(PGSM_HASH_SEQ_STATUS * hstat, PGSM_HASH_TABLE * shared_hash, bool lock);
void *pgsm_hash_seq_next(PGSM_HASH_SEQ_STATUS * hstat); void *pgsm_hash_seq_next(PGSM_HASH_SEQ_STATUS * hstat);
void pgsm_hash_seq_term(PGSM_HASH_SEQ_STATUS * hstat); void pgsm_hash_seq_term(PGSM_HASH_SEQ_STATUS * hstat);