PostgreSQL Source Code git master
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, void *arg)
 
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 132 of file test_dsm_registry.c.

133{
136 text *val = NULL;
137
139
140 entry = dshash_find(tdr_hash, key, false);
141 if (entry == NULL)
143
145
147
149}
#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:560
void * dshash_find(dshash_table *hash_table, const void *key, bool exclusive)
Definition: dshash.c:392
#define PG_GETARG_DATUM(n)
Definition: fmgr.h:268
#define PG_RETURN_NULL()
Definition: fmgr.h:346
#define PG_RETURN_TEXT_P(x)
Definition: fmgr.h:374
long val
Definition: informix.c:689
Definition: c.h:712
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 90 of file test_dsm_registry.c.

91{
92 int ret;
93
95
97 ret = tdr_dsm->val;
99
100 PG_RETURN_INT32(ret);
101}
#define PG_RETURN_INT32(x)
Definition: fmgr.h:355
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1178
void LWLockRelease(LWLock *lock)
Definition: lwlock.c:1898
@ 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,
void *  arg 
)
static

Definition at line 47 of file test_dsm_registry.c.

48{
50
51 if ((int) (intptr_t) arg != 5432)
52 elog(ERROR, "unexpected arg value %d", (int) (intptr_t) arg);
53
54 LWLockInitialize(&dsm->lck, LWLockNewTrancheId("test_dsm_registry"));
55 dsm->val = 0;
56}
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:226
int LWLockNewTrancheId(const char *name)
Definition: lwlock.c:596
void LWLockInitialize(LWLock *lock, int tranche_id)
Definition: lwlock.c:698
void * arg

References arg, elog, ERROR, 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 105 of file test_dsm_registry.c.

106{
110 bool found;
111
112 if (strlen(key) >= offsetof(TestDSMRegistryHashEntry, val))
114 (errmsg("key too long")));
115
117
118 entry = dshash_find_or_insert(tdr_hash, key, &found);
119 if (found)
120 dsa_free(tdr_dsa, entry->val);
121
122 entry->val = dsa_allocate(tdr_dsa, strlen(val) + 1);
123 strcpy(dsa_get_address(tdr_dsa, entry->val), val);
124
126
128}
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:435
int errmsg(const char *fmt,...)
Definition: elog.c:1080
#define ereport(elevel,...)
Definition: elog.h:150
#define PG_RETURN_VOID()
Definition: fmgr.h:350

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 59 of file test_dsm_registry.c.

60{
61 bool found;
62
63 tdr_dsm = GetNamedDSMSegment("test_dsm_registry_dsm",
66 &found, (void *) (intptr_t) 5432);
67
68 if (tdr_dsa == NULL)
69 tdr_dsa = GetNamedDSA("test_dsm_registry_dsa", &found);
70
71 if (tdr_hash == NULL)
72 tdr_hash = GetNamedDSHash("test_dsm_registry_hash", &dsh_params, &found);
73}
dsa_area * GetNamedDSA(const char *name, bool *found)
Definition: dsm_registry.c:276
void * GetNamedDSMSegment(const char *name, size_t size, void(*init_callback)(void *ptr, void *arg), bool *found, void *arg)
Definition: dsm_registry.c:187
dshash_table * GetNamedDSHash(const char *name, const dshash_parameters *params, bool *found)
Definition: dsm_registry.c:357
static void init_tdr_dsm(void *ptr, void *arg)
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:624
dshash_hash dshash_strhash(const void *v, size_t size, void *arg)
Definition: dshash.c:613
int dshash_strcmp(const void *a, const void *b, size_t size, void *arg)
Definition: dshash.c:601
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().