mirror of
https://github.com/postgres/postgres.git
synced 2025-12-21 05:21:08 +03:00
Add support to dynahash.c for partitioning shared hashtables according
to the low-order bits of the entry hash value. Also make some incidental cleanups in the dynahash API, such as not exporting the hash header structs to the world.
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* hsearch.h
|
||||
* for hash tables, particularly hash tables in shared memory
|
||||
* exported definitions for utils/hash/dynahash.c; see notes therein
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/utils/hsearch.h,v 1.43 2006/06/25 18:29:49 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/utils/hsearch.h,v 1.44 2006/07/22 23:04:39 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -43,27 +43,6 @@ typedef void *(*HashCopyFunc) (void *dest, const void *src, Size keysize);
|
||||
*/
|
||||
typedef void *(*HashAllocFunc) (Size request);
|
||||
|
||||
/*
|
||||
* Constants
|
||||
*
|
||||
* A hash table has a top-level "directory", each of whose entries points
|
||||
* to a "segment" of ssize bucket headers. The maximum number of hash
|
||||
* buckets is thus dsize * ssize (but dsize may be expansible). Of course,
|
||||
* the number of records in the table can be larger, but we don't want a
|
||||
* whole lot of records per bucket or performance goes down.
|
||||
*
|
||||
* In a hash table allocated in shared memory, the directory cannot be
|
||||
* expanded because it must stay at a fixed address. The directory size
|
||||
* should be selected using hash_select_dirsize (and you'd better have
|
||||
* a good idea of the maximum number of entries!). For non-shared hash
|
||||
* tables, the initial directory size can be left at the default.
|
||||
*/
|
||||
#define DEF_SEGSIZE 256
|
||||
#define DEF_SEGSIZE_SHIFT 8 /* must be log2(DEF_SEGSIZE) */
|
||||
#define DEF_DIRSIZE 256
|
||||
#define DEF_FFACTOR 1 /* default fill factor */
|
||||
|
||||
|
||||
/*
|
||||
* HASHELEMENT is the private part of a hashtable entry. The caller's data
|
||||
* follows the HASHELEMENT structure (on a MAXALIGN'd boundary). The hash key
|
||||
@@ -75,81 +54,42 @@ typedef struct HASHELEMENT
|
||||
uint32 hashvalue; /* hash function result for this entry */
|
||||
} HASHELEMENT;
|
||||
|
||||
/* A hash bucket is a linked list of HASHELEMENTs */
|
||||
typedef HASHELEMENT *HASHBUCKET;
|
||||
/* Hash table header struct is an opaque type known only within dynahash.c */
|
||||
typedef struct HASHHDR HASHHDR;
|
||||
|
||||
/* A hash segment is an array of bucket headers */
|
||||
typedef HASHBUCKET *HASHSEGMENT;
|
||||
|
||||
/* Header structure for a hash table --- contains all changeable info */
|
||||
typedef struct HASHHDR
|
||||
{
|
||||
long dsize; /* Directory Size */
|
||||
long ssize; /* Segment Size --- must be power of 2 */
|
||||
int sshift; /* Segment shift = log2(ssize) */
|
||||
uint32 max_bucket; /* ID of Maximum bucket in use */
|
||||
uint32 high_mask; /* Mask to modulo into entire table */
|
||||
uint32 low_mask; /* Mask to modulo into lower half of table */
|
||||
long ffactor; /* Fill factor */
|
||||
long nentries; /* Number of entries in hash table */
|
||||
long nsegs; /* Number of allocated segments */
|
||||
Size keysize; /* hash key length in bytes */
|
||||
Size entrysize; /* total user element size in bytes */
|
||||
long max_dsize; /* 'dsize' limit if directory is fixed size */
|
||||
int nelem_alloc; /* number of entries to allocate at once */
|
||||
HASHELEMENT *freeList; /* linked list of free elements */
|
||||
#ifdef HASH_STATISTICS
|
||||
long accesses;
|
||||
long collisions;
|
||||
#endif
|
||||
} HASHHDR;
|
||||
|
||||
/*
|
||||
* Top control structure for a hashtable --- need not be shared, since
|
||||
* no fields change at runtime
|
||||
*/
|
||||
typedef struct HTAB
|
||||
{
|
||||
HASHHDR *hctl; /* shared control information */
|
||||
HASHSEGMENT *dir; /* directory of segment starts */
|
||||
HashValueFunc hash; /* hash function */
|
||||
HashCompareFunc match; /* key comparison function */
|
||||
HashCopyFunc keycopy; /* key copying function */
|
||||
HashAllocFunc alloc; /* memory allocator */
|
||||
MemoryContext hcxt; /* memory context if default allocator used */
|
||||
char *tabname; /* table name (for error messages) */
|
||||
bool isshared; /* true if table is in shared memory */
|
||||
} HTAB;
|
||||
/* Hash table control struct is an opaque type known only within dynahash.c */
|
||||
typedef struct HTAB HTAB;
|
||||
|
||||
/* Parameter data structure for hash_create */
|
||||
/* Only those fields indicated by hash_flags need be set */
|
||||
typedef struct HASHCTL
|
||||
{
|
||||
long ssize; /* Segment Size */
|
||||
long dsize; /* (initial) Directory Size */
|
||||
long max_dsize; /* limit to dsize if directory size is limited */
|
||||
long ffactor; /* Fill factor */
|
||||
long num_partitions; /* # partitions (must be power of 2) */
|
||||
long ssize; /* segment size */
|
||||
long dsize; /* (initial) directory size */
|
||||
long max_dsize; /* limit to dsize if dir size is limited */
|
||||
long ffactor; /* fill factor */
|
||||
Size keysize; /* hash key length in bytes */
|
||||
Size entrysize; /* total user element size in bytes */
|
||||
HashValueFunc hash; /* hash function */
|
||||
HashCompareFunc match; /* key comparison function */
|
||||
HashCopyFunc keycopy; /* key copying function */
|
||||
HashAllocFunc alloc; /* memory allocator */
|
||||
HASHSEGMENT *dir; /* directory of segment starts */
|
||||
HASHHDR *hctl; /* location of header in shared mem */
|
||||
MemoryContext hcxt; /* memory context to use for allocations */
|
||||
HASHHDR *hctl; /* location of header in shared mem */
|
||||
} HASHCTL;
|
||||
|
||||
/* Flags to indicate which parameters are supplied */
|
||||
#define HASH_PARTITION 0x001 /* Hashtable is used w/partitioned locking */
|
||||
#define HASH_SEGMENT 0x002 /* Set segment size */
|
||||
#define HASH_DIRSIZE 0x004 /* Set directory size */
|
||||
#define HASH_DIRSIZE 0x004 /* Set directory size (initial and max) */
|
||||
#define HASH_FFACTOR 0x008 /* Set fill factor */
|
||||
#define HASH_FUNCTION 0x010 /* Set user defined hash function */
|
||||
#define HASH_ELEM 0x020 /* Set key/entry size */
|
||||
#define HASH_ELEM 0x020 /* Set keysize and entrysize */
|
||||
#define HASH_SHARED_MEM 0x040 /* Hashtable is in shared memory */
|
||||
#define HASH_ATTACH 0x080 /* Do not initialize hctl */
|
||||
#define HASH_ALLOC 0x100 /* Set memory allocator */
|
||||
#define HASH_CONTEXT 0x200 /* Set explicit memory context */
|
||||
#define HASH_CONTEXT 0x200 /* Set memory allocation context */
|
||||
#define HASH_COMPARE 0x400 /* Set user defined comparison function */
|
||||
#define HASH_KEYCOPY 0x800 /* Set user defined key-copying function */
|
||||
|
||||
@@ -183,10 +123,16 @@ extern void hash_destroy(HTAB *hashp);
|
||||
extern void hash_stats(const char *where, HTAB *hashp);
|
||||
extern void *hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action,
|
||||
bool *foundPtr);
|
||||
extern uint32 get_hash_value(HTAB *hashp, const void *keyPtr);
|
||||
extern void *hash_search_with_hash_value(HTAB *hashp, const void *keyPtr,
|
||||
uint32 hashvalue, HASHACTION action,
|
||||
bool *foundPtr);
|
||||
extern long hash_get_num_entries(HTAB *hashp);
|
||||
extern void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp);
|
||||
extern void *hash_seq_search(HASH_SEQ_STATUS *status);
|
||||
extern Size hash_estimate_size(long num_entries, Size entrysize);
|
||||
extern long hash_select_dirsize(long num_entries);
|
||||
extern Size hash_get_shared_size(HASHCTL *info, int flags);
|
||||
|
||||
/*
|
||||
* prototypes for functions in hashfn.c
|
||||
|
||||
Reference in New Issue
Block a user