PostgreSQL Source Code
git master
|
#include "postgres.h"
#include "common/hashfn.h"
#include "lib/dshash.h"
#include "storage/ipc.h"
#include "storage/lwlock.h"
#include "utils/dsa.h"
#include "utils/memutils.h"
Go to the source code of this file.
Data Structures | |
struct | dshash_table_item |
struct | dshash_partition |
struct | dshash_table_control |
struct | dshash_table |
Macros | |
#define | DSHASH_NUM_PARTITIONS_LOG2 7 |
#define | DSHASH_NUM_PARTITIONS (1 << DSHASH_NUM_PARTITIONS_LOG2) |
#define | DSHASH_MAGIC 0x75ff6a20 |
#define | ENTRY_FROM_ITEM(item) ((char *)(item) + MAXALIGN(sizeof(dshash_table_item))) |
#define | ITEM_FROM_ENTRY(entry) |
#define | NUM_SPLITS(size_log2) (size_log2 - DSHASH_NUM_PARTITIONS_LOG2) |
#define | BUCKETS_PER_PARTITION(size_log2) (((size_t) 1) << NUM_SPLITS(size_log2)) |
#define | MAX_COUNT_PER_PARTITION(hash_table) |
#define | PARTITION_FOR_HASH(hash) (hash >> ((sizeof(dshash_hash) * CHAR_BIT) - DSHASH_NUM_PARTITIONS_LOG2)) |
#define | BUCKET_INDEX_FOR_HASH_AND_SIZE(hash, size_log2) (hash >> ((sizeof(dshash_hash) * CHAR_BIT) - (size_log2))) |
#define | BUCKET_INDEX_FOR_PARTITION(partition, size_log2) ((partition) << NUM_SPLITS(size_log2)) |
#define | BUCKET_FOR_HASH(hash_table, hash) |
#define | PARTITION_LOCK(hash_table, i) (&(hash_table)->control->partitions[(i)].lock) |
Typedefs | |
typedef struct dshash_partition | dshash_partition |
typedef struct dshash_table_control | dshash_table_control |
Functions | |
static void | delete_item (dshash_table *hash_table, dshash_table_item *item) |
static void | resize (dshash_table *hash_table, size_t new_size) |
static void | ensure_valid_bucket_pointers (dshash_table *hash_table) |
static dshash_table_item * | find_in_bucket (dshash_table *hash_table, const void *key, dsa_pointer item_pointer) |
static void | insert_item_into_bucket (dshash_table *hash_table, dsa_pointer item_pointer, dshash_table_item *item, dsa_pointer *bucket) |
static dshash_table_item * | insert_into_bucket (dshash_table *hash_table, const void *key, dsa_pointer *bucket) |
static bool | delete_key_from_bucket (dshash_table *hash_table, const void *key, dsa_pointer *bucket_head) |
static bool | delete_item_from_bucket (dshash_table *hash_table, dshash_table_item *item, dsa_pointer *bucket_head) |
static dshash_hash | hash_key (dshash_table *hash_table, const void *key) |
static bool | equal_keys (dshash_table *hash_table, const void *a, const void *b) |
dshash_table * | dshash_create (dsa_area *area, const dshash_parameters *params, void *arg) |
dshash_table * | dshash_attach (dsa_area *area, const dshash_parameters *params, dshash_table_handle handle, void *arg) |
void | dshash_detach (dshash_table *hash_table) |
void | dshash_destroy (dshash_table *hash_table) |
dshash_table_handle | dshash_get_hash_table_handle (dshash_table *hash_table) |
void * | dshash_find (dshash_table *hash_table, const void *key, bool exclusive) |
void * | dshash_find_or_insert (dshash_table *hash_table, const void *key, bool *found) |
bool | dshash_delete_key (dshash_table *hash_table, const void *key) |
void | dshash_delete_entry (dshash_table *hash_table, void *entry) |
void | dshash_release_lock (dshash_table *hash_table, void *entry) |
int | dshash_memcmp (const void *a, const void *b, size_t size, void *arg) |
dshash_hash | dshash_memhash (const void *v, size_t size, void *arg) |
void | dshash_dump (dshash_table *hash_table) |
#define BUCKET_FOR_HASH | ( | hash_table, | |
hash | |||
) |
Definition at line 157 of file dshash.c.
Referenced by delete_item(), dshash_delete_key(), dshash_find(), and dshash_find_or_insert().
#define BUCKET_INDEX_FOR_HASH_AND_SIZE | ( | hash, | |
size_log2 | |||
) | (hash >> ((sizeof(dshash_hash) * CHAR_BIT) - (size_log2))) |
#define BUCKET_INDEX_FOR_PARTITION | ( | partition, | |
size_log2 | |||
) | ((partition) << NUM_SPLITS(size_log2)) |
Definition at line 153 of file dshash.c.
Referenced by dshash_dump().
#define BUCKETS_PER_PARTITION | ( | size_log2 | ) | (((size_t) 1) << NUM_SPLITS(size_log2)) |
#define DSHASH_MAGIC 0x75ff6a20 |
Definition at line 65 of file dshash.c.
Referenced by dshash_attach(), dshash_create(), dshash_delete_entry(), dshash_delete_key(), dshash_destroy(), dshash_dump(), dshash_find(), dshash_find_or_insert(), dshash_get_hash_table_handle(), and dshash_release_lock().
#define DSHASH_NUM_PARTITIONS (1 << DSHASH_NUM_PARTITIONS_LOG2) |
Definition at line 62 of file dshash.c.
Referenced by dshash_create(), dshash_dump(), and resize().
#define DSHASH_NUM_PARTITIONS_LOG2 7 |
Definition at line 61 of file dshash.c.
Referenced by dshash_create().
#define ENTRY_FROM_ITEM | ( | item | ) | ((char *)(item) + MAXALIGN(sizeof(dshash_table_item))) |
Definition at line 118 of file dshash.c.
Referenced by delete_key_from_bucket(), dshash_find(), dshash_find_or_insert(), find_in_bucket(), and insert_into_bucket().
#define ITEM_FROM_ENTRY | ( | entry | ) |
Definition at line 122 of file dshash.c.
Referenced by dshash_delete_entry(), and dshash_release_lock().
#define MAX_COUNT_PER_PARTITION | ( | hash_table | ) |
Definition at line 135 of file dshash.c.
Referenced by dshash_find_or_insert().
#define NUM_SPLITS | ( | size_log2 | ) | (size_log2 - DSHASH_NUM_PARTITIONS_LOG2) |
#define PARTITION_FOR_HASH | ( | hash | ) | (hash >> ((sizeof(dshash_hash) * CHAR_BIT) - DSHASH_NUM_PARTITIONS_LOG2)) |
Definition at line 140 of file dshash.c.
Referenced by delete_item(), dshash_delete_entry(), dshash_delete_key(), dshash_find(), dshash_find_or_insert(), and dshash_release_lock().
#define PARTITION_LOCK | ( | hash_table, | |
i | |||
) | (&(hash_table)->control->partitions[(i)].lock) |
Definition at line 186 of file dshash.c.
Referenced by delete_item(), dshash_delete_entry(), dshash_delete_key(), dshash_dump(), dshash_find(), dshash_find_or_insert(), dshash_release_lock(), and resize().
typedef struct dshash_partition dshash_partition |
typedef struct dshash_table_control dshash_table_control |
|
static |
Definition at line 654 of file dshash.c.
References Assert, BUCKET_FOR_HASH, dshash_table::control, dshash_partition::count, delete_item_from_bucket(), dshash_table_item::hash, LWLockHeldByMe(), PARTITION_FOR_HASH, PARTITION_LOCK, and dshash_table_control::partitions.
Referenced by dshash_delete_entry().
|
static |
Definition at line 855 of file dshash.c.
References dshash_table::area, dsa_free(), dsa_get_address(), DsaPointerIsValid, and dshash_table_item::next.
Referenced by delete_item().
|
static |
Definition at line 826 of file dshash.c.
References dshash_table::area, dsa_free(), dsa_get_address(), DsaPointerIsValid, ENTRY_FROM_ITEM, equal_keys(), and dshash_table_item::next.
Referenced by dshash_delete_key().
dshash_table* dshash_attach | ( | dsa_area * | area, |
const dshash_parameters * | params, | ||
dshash_table_handle | handle, | ||
void * | arg | ||
) |
Definition at line 263 of file dshash.c.
References dshash_table::area, arg, dshash_table::arg, Assert, dshash_table::buckets, dshash_table::control, dsa_get_address(), DSHASH_MAGIC, dshash_table::find_exclusively_locked, dshash_table::find_locked, dshash_table_control::magic, palloc(), dshash_table::params, and dshash_table::size_log2.
Referenced by SharedRecordTypmodRegistryAttach().
dshash_table* dshash_create | ( | dsa_area * | area, |
const dshash_parameters * | params, | ||
void * | arg | ||
) |
Definition at line 196 of file dshash.c.
References dshash_table::area, arg, dshash_table::arg, dshash_table_control::buckets, dshash_table::buckets, dshash_table::control, dshash_partition::count, DSA_ALLOC_NO_OOM, DSA_ALLOC_ZERO, dsa_allocate, dsa_allocate_extended(), dsa_free(), dsa_get_address(), DsaPointerIsValid, DSHASH_MAGIC, DSHASH_NUM_PARTITIONS, DSHASH_NUM_PARTITIONS_LOG2, ereport, errcode(), errdetail(), errmsg(), ERROR, dshash_table::find_exclusively_locked, dshash_table::find_locked, dshash_table_control::handle, i, dshash_table_control::lwlock_tranche_id, LWLockInitialize(), dshash_table_control::magic, palloc(), dshash_table::params, dshash_table_control::partitions, partitions, dshash_table_control::size_log2, dshash_table::size_log2, and dshash_parameters::tranche_id.
Referenced by SharedRecordTypmodRegistryInit().
void dshash_delete_entry | ( | dshash_table * | hash_table, |
void * | entry | ||
) |
Definition at line 540 of file dshash.c.
References Assert, dshash_table::control, delete_item(), DSHASH_MAGIC, dshash_table::find_exclusively_locked, dshash_table::find_locked, dshash_table_item::hash, ITEM_FROM_ENTRY, LW_EXCLUSIVE, LWLockHeldByMeInMode(), LWLockRelease(), dshash_table_control::magic, PARTITION_FOR_HASH, and PARTITION_LOCK.
bool dshash_delete_key | ( | dshash_table * | hash_table, |
const void * | key | ||
) |
Definition at line 502 of file dshash.c.
References Assert, BUCKET_FOR_HASH, dshash_table::control, dshash_partition::count, delete_key_from_bucket(), DSHASH_MAGIC, ensure_valid_bucket_pointers(), dshash_table::find_locked, dshash_table_item::hash, hash_key(), LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), dshash_table_control::magic, PARTITION_FOR_HASH, PARTITION_LOCK, and dshash_table_control::partitions.
Referenced by find_or_make_matching_shared_tupledesc().
void dshash_destroy | ( | dshash_table * | hash_table | ) |
Definition at line 318 of file dshash.c.
References dshash_table::area, Assert, dshash_table_control::buckets, dshash_table::buckets, dshash_table::control, dsa_free(), dsa_get_address(), DsaPointerIsValid, DSHASH_MAGIC, ensure_valid_bucket_pointers(), dshash_table_control::handle, i, dshash_table_control::magic, dshash_table_item::next, pfree(), and dshash_table::size_log2.
void dshash_detach | ( | dshash_table * | hash_table | ) |
Definition at line 302 of file dshash.c.
References Assert, dshash_table::find_locked, and pfree().
Referenced by shared_record_typmod_registry_detach().
void dshash_dump | ( | dshash_table * | hash_table | ) |
Definition at line 600 of file dshash.c.
References dshash_table::area, Assert, BUCKET_INDEX_FOR_PARTITION, dshash_table::buckets, dshash_table::control, dshash_partition::count, dsa_get_address(), DsaPointerIsValid, DSHASH_MAGIC, DSHASH_NUM_PARTITIONS, ensure_valid_bucket_pointers(), dshash_table::find_locked, fprintf, i, LW_SHARED, LWLockAcquire(), LWLockHeldByMe(), LWLockRelease(), dshash_table_control::magic, dshash_table_item::next, PARTITION_LOCK, dshash_table_control::partitions, and dshash_table::size_log2.
void* dshash_find | ( | dshash_table * | hash_table, |
const void * | key, | ||
bool | exclusive | ||
) |
Definition at line 385 of file dshash.c.
References Assert, BUCKET_FOR_HASH, dshash_table::control, DSHASH_MAGIC, ensure_valid_bucket_pointers(), ENTRY_FROM_ITEM, dshash_table::find_exclusively_locked, find_in_bucket(), dshash_table::find_locked, dshash_table_item::hash, hash_key(), LW_EXCLUSIVE, LW_SHARED, LWLockAcquire(), LWLockRelease(), dshash_table_control::magic, PARTITION_FOR_HASH, and PARTITION_LOCK.
Referenced by find_or_make_matching_shared_tupledesc(), and lookup_rowtype_tupdesc_internal().
void* dshash_find_or_insert | ( | dshash_table * | hash_table, |
const void * | key, | ||
bool * | found | ||
) |
Definition at line 430 of file dshash.c.
References Assert, BUCKET_FOR_HASH, dshash_table::control, dshash_partition::count, DSHASH_MAGIC, ensure_valid_bucket_pointers(), ENTRY_FROM_ITEM, dshash_table::find_exclusively_locked, find_in_bucket(), dshash_table::find_locked, dshash_table_item::hash, hash_key(), insert_into_bucket(), LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), dshash_table_control::magic, MAX_COUNT_PER_PARTITION, PARTITION_FOR_HASH, PARTITION_LOCK, dshash_table_control::partitions, resize(), and dshash_table::size_log2.
Referenced by find_or_make_matching_shared_tupledesc(), and SharedRecordTypmodRegistryInit().
dshash_table_handle dshash_get_hash_table_handle | ( | dshash_table * | hash_table | ) |
Definition at line 362 of file dshash.c.
References Assert, dshash_table::control, DSHASH_MAGIC, dshash_table_control::handle, and dshash_table_control::magic.
Referenced by SharedRecordTypmodRegistryInit().
int dshash_memcmp | ( | const void * | a, |
const void * | b, | ||
size_t | size, | ||
void * | arg | ||
) |
dshash_hash dshash_memhash | ( | const void * | v, |
size_t | size, | ||
void * | arg | ||
) |
void dshash_release_lock | ( | dshash_table * | hash_table, |
void * | entry | ||
) |
Definition at line 561 of file dshash.c.
References Assert, dshash_table::control, DSHASH_MAGIC, dshash_table::find_exclusively_locked, dshash_table::find_locked, dshash_table_item::hash, ITEM_FROM_ENTRY, LW_EXCLUSIVE, LW_SHARED, LWLockHeldByMeInMode(), LWLockRelease(), dshash_table_control::magic, PARTITION_FOR_HASH, and PARTITION_LOCK.
Referenced by find_or_make_matching_shared_tupledesc(), lookup_rowtype_tupdesc_internal(), and SharedRecordTypmodRegistryInit().
|
inlinestatic |
Definition at line 757 of file dshash.c.
References dshash_table::area, dshash_table_control::buckets, dshash_table::buckets, dshash_table::control, dsa_get_address(), dshash_table_control::size_log2, and dshash_table::size_log2.
Referenced by dshash_delete_key(), dshash_destroy(), dshash_dump(), dshash_find(), and dshash_find_or_insert().
|
inlinestatic |
Definition at line 894 of file dshash.c.
References dshash_table::arg, dshash_parameters::compare_function, dshash_parameters::key_size, and dshash_table::params.
Referenced by delete_key_from_bucket(), and find_in_bucket().
|
inlinestatic |
Definition at line 771 of file dshash.c.
References dshash_table::area, dsa_get_address(), DsaPointerIsValid, ENTRY_FROM_ITEM, equal_keys(), and dshash_table_item::next.
Referenced by dshash_find(), and dshash_find_or_insert().
|
inlinestatic |
Definition at line 883 of file dshash.c.
References dshash_table::arg, dshash_parameters::hash_function, dshash_parameters::key_size, and dshash_table::params.
Referenced by compute_tsvector_stats(), dshash_delete_key(), dshash_find(), and dshash_find_or_insert().
|
static |
Definition at line 806 of file dshash.c.
References dshash_table::area, dsa_allocate, dsa_get_address(), ENTRY_FROM_ITEM, dshash_parameters::entry_size, insert_item_into_bucket(), dshash_parameters::key_size, MAXALIGN, and dshash_table::params.
Referenced by dshash_find_or_insert().
|
static |
Definition at line 790 of file dshash.c.
References dshash_table::area, Assert, dsa_get_address(), and dshash_table_item::next.
Referenced by insert_into_bucket(), and resize().
|
static |
Definition at line 680 of file dshash.c.
References dshash_table::area, Assert, BUCKET_INDEX_FOR_HASH_AND_SIZE, dshash_table_control::buckets, dshash_table::buckets, dshash_table::control, dsa_allocate0, dsa_free(), dsa_get_address(), DsaPointerIsValid, DSHASH_NUM_PARTITIONS, dshash_table_item::hash, i, insert_item_into_bucket(), LW_EXCLUSIVE, LWLockAcquire(), LWLockHeldByMe(), LWLockRelease(), dshash_table_item::next, PARTITION_LOCK, and dshash_table_control::size_log2.
Referenced by dshash_find_or_insert().