PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
test_dsm_registry.c File Reference
#include "postgres.h"
#include "fmgr.h"
#include "storage/dsm_registry.h"
#include "storage/lwlock.h"
#include "utils/builtins.h"
Include dependency graph for test_dsm_registry.c:

Go to the source code of this file.

Data Structures

struct  TestDSMRegistryStruct
 
struct  TestDSMRegistryHashEntry
 

Typedefs

typedef struct TestDSMRegistryStruct TestDSMRegistryStruct
 
typedef struct TestDSMRegistryHashEntry TestDSMRegistryHashEntry
 

Functions

static void init_tdr_dsm (void *ptr)
 
static void tdr_attach_shmem (void)
 
 PG_FUNCTION_INFO_V1 (set_val_in_shmem)
 
Datum set_val_in_shmem (PG_FUNCTION_ARGS)
 
 PG_FUNCTION_INFO_V1 (get_val_in_shmem)
 
Datum get_val_in_shmem (PG_FUNCTION_ARGS)
 
 PG_FUNCTION_INFO_V1 (set_val_in_hash)
 
Datum set_val_in_hash (PG_FUNCTION_ARGS)
 
 PG_FUNCTION_INFO_V1 (get_val_in_hash)
 
Datum get_val_in_hash (PG_FUNCTION_ARGS)
 

Variables

 PG_MODULE_MAGIC
 
static TestDSMRegistryStructtdr_dsm
 
static dsa_areatdr_dsa
 
static dshash_tabletdr_hash
 
static const dshash_parameters dsh_params
 

Typedef Documentation

◆ TestDSMRegistryHashEntry

◆ TestDSMRegistryStruct

Function Documentation

◆ get_val_in_hash()

Datum get_val_in_hash ( PG_FUNCTION_ARGS  )

Definition at line 129 of file test_dsm_registry.c.

130{
133 text *val = NULL;
134
136
137 entry = dshash_find(tdr_hash, key, false);
138 if (entry == NULL)
140
142
144
146}
#define TextDatumGetCString(d)
Definition: builtins.h:98
void * dsa_get_address(dsa_area *area, dsa_pointer dp)
Definition: dsa.c:957
void dshash_release_lock(dshash_table *hash_table, void *entry)
Definition: dshash.c:558
void * dshash_find(dshash_table *hash_table, const void *key, bool exclusive)
Definition: dshash.c:390
#define PG_GETARG_DATUM(n)
Definition: fmgr.h:268
#define PG_RETURN_NULL()
Definition: fmgr.h:345
#define PG_RETURN_TEXT_P(x)
Definition: fmgr.h:372
long val
Definition: informix.c:689
Definition: c.h:696
static dshash_table * tdr_hash
static void tdr_attach_shmem(void)
static dsa_area * tdr_dsa
text * cstring_to_text(const char *s)
Definition: varlena.c:181

References cstring_to_text(), dsa_get_address(), dshash_find(), dshash_release_lock(), sort-test::key, PG_GETARG_DATUM, PG_RETURN_NULL, PG_RETURN_TEXT_P, tdr_attach_shmem(), tdr_dsa, tdr_hash, TextDatumGetCString, val, and TestDSMRegistryHashEntry::val.

◆ get_val_in_shmem()

Datum get_val_in_shmem ( PG_FUNCTION_ARGS  )

Definition at line 87 of file test_dsm_registry.c.

88{
89 int ret;
90
92
94 ret = tdr_dsm->val;
96
97 PG_RETURN_INT32(ret);
98}
#define PG_RETURN_INT32(x)
Definition: fmgr.h:354
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1174
void LWLockRelease(LWLock *lock)
Definition: lwlock.c:1894
@ LW_SHARED
Definition: lwlock.h:113
static TestDSMRegistryStruct * tdr_dsm

References TestDSMRegistryStruct::lck, LW_SHARED, LWLockAcquire(), LWLockRelease(), PG_RETURN_INT32, tdr_attach_shmem(), tdr_dsm, and TestDSMRegistryStruct::val.

◆ init_tdr_dsm()

static void init_tdr_dsm ( void *  ptr)
static

Definition at line 47 of file test_dsm_registry.c.

48{
50
51 LWLockInitialize(&dsm->lck, LWLockNewTrancheId("test_dsm_registry"));
52 dsm->val = 0;
53}
int LWLockNewTrancheId(const char *name)
Definition: lwlock.c:596
void LWLockInitialize(LWLock *lock, int tranche_id)
Definition: lwlock.c:698

References TestDSMRegistryStruct::lck, LWLockInitialize(), LWLockNewTrancheId(), and TestDSMRegistryStruct::val.

Referenced by tdr_attach_shmem().

◆ PG_FUNCTION_INFO_V1() [1/4]

PG_FUNCTION_INFO_V1 ( get_val_in_hash  )

◆ PG_FUNCTION_INFO_V1() [2/4]

PG_FUNCTION_INFO_V1 ( get_val_in_shmem  )

◆ PG_FUNCTION_INFO_V1() [3/4]

PG_FUNCTION_INFO_V1 ( set_val_in_hash  )

◆ PG_FUNCTION_INFO_V1() [4/4]

PG_FUNCTION_INFO_V1 ( set_val_in_shmem  )

◆ set_val_in_hash()

Datum set_val_in_hash ( PG_FUNCTION_ARGS  )

Definition at line 102 of file test_dsm_registry.c.

103{
107 bool found;
108
109 if (strlen(key) >= offsetof(TestDSMRegistryHashEntry, val))
111 (errmsg("key too long")));
112
114
115 entry = dshash_find_or_insert(tdr_hash, key, &found);
116 if (found)
117 dsa_free(tdr_dsa, entry->val);
118
119 entry->val = dsa_allocate(tdr_dsa, strlen(val) + 1);
120 strcpy(dsa_get_address(tdr_dsa, entry->val), val);
121
123
125}
void dsa_free(dsa_area *area, dsa_pointer dp)
Definition: dsa.c:841
#define dsa_allocate(area, size)
Definition: dsa.h:109
void * dshash_find_or_insert(dshash_table *hash_table, const void *key, bool *found)
Definition: dshash.c:433
int errmsg(const char *fmt,...)
Definition: elog.c:1080
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:150
#define PG_RETURN_VOID()
Definition: fmgr.h:349

References dsa_allocate, dsa_free(), dsa_get_address(), dshash_find_or_insert(), dshash_release_lock(), ereport, errmsg(), ERROR, sort-test::key, PG_GETARG_DATUM, PG_RETURN_VOID, tdr_attach_shmem(), tdr_dsa, tdr_hash, TextDatumGetCString, val, and TestDSMRegistryHashEntry::val.

◆ set_val_in_shmem()

◆ tdr_attach_shmem()

static void tdr_attach_shmem ( void  )
static

Definition at line 56 of file test_dsm_registry.c.

57{
58 bool found;
59
60 tdr_dsm = GetNamedDSMSegment("test_dsm_registry_dsm",
63 &found);
64
65 if (tdr_dsa == NULL)
66 tdr_dsa = GetNamedDSA("test_dsm_registry_dsa", &found);
67
68 if (tdr_hash == NULL)
69 tdr_hash = GetNamedDSHash("test_dsm_registry_hash", &dsh_params, &found);
70}
dsa_area * GetNamedDSA(const char *name, bool *found)
Definition: dsm_registry.c:272
dshash_table * GetNamedDSHash(const char *name, const dshash_parameters *params, bool *found)
Definition: dsm_registry.c:344
void * GetNamedDSMSegment(const char *name, size_t size, void(*init_callback)(void *ptr), bool *found)
Definition: dsm_registry.c:185
static void init_tdr_dsm(void *ptr)
static const dshash_parameters dsh_params

References dsh_params, GetNamedDSA(), GetNamedDSHash(), GetNamedDSMSegment(), init_tdr_dsm(), tdr_dsa, tdr_dsm, and tdr_hash.

Referenced by get_val_in_hash(), get_val_in_shmem(), set_val_in_hash(), and set_val_in_shmem().

Variable Documentation

◆ dsh_params

const dshash_parameters dsh_params
static
Initial value:
= {
}
void dshash_strcpy(void *dest, const void *src, size_t size, void *arg)
Definition: dshash.c:622
dshash_hash dshash_strhash(const void *v, size_t size, void *arg)
Definition: dshash.c:611
int dshash_strcmp(const void *a, const void *b, size_t size, void *arg)
Definition: dshash.c:599
struct TestDSMRegistryHashEntry TestDSMRegistryHashEntry

Definition at line 38 of file test_dsm_registry.c.

Referenced by tdr_attach_shmem().

◆ PG_MODULE_MAGIC

PG_MODULE_MAGIC

Definition at line 20 of file test_dsm_registry.c.

◆ tdr_dsa

dsa_area* tdr_dsa
static

Definition at line 35 of file test_dsm_registry.c.

Referenced by get_val_in_hash(), set_val_in_hash(), and tdr_attach_shmem().

◆ tdr_dsm

TestDSMRegistryStruct* tdr_dsm
static

Definition at line 34 of file test_dsm_registry.c.

Referenced by get_val_in_shmem(), set_val_in_shmem(), and tdr_attach_shmem().

◆ tdr_hash

dshash_table* tdr_hash
static

Definition at line 36 of file test_dsm_registry.c.

Referenced by get_val_in_hash(), set_val_in_hash(), and tdr_attach_shmem().