Thanks to visit codestin.com
Credit goes to doxygen.postgresql.org

PostgreSQL Source Code git master
test_dsm_registry.c
Go to the documentation of this file.
1/*--------------------------------------------------------------------------
2 *
3 * test_dsm_registry.c
4 * Test the dynamic shared memory registry.
5 *
6 * Copyright (c) 2024-2025, PostgreSQL Global Development Group
7 *
8 * IDENTIFICATION
9 * src/test/modules/test_dsm_registry/test_dsm_registry.c
10 *
11 * -------------------------------------------------------------------------
12 */
13#include "postgres.h"
14
15#include "fmgr.h"
17#include "storage/lwlock.h"
18#include "utils/builtins.h"
19
21
23{
24 int val;
27
29{
30 char key[64];
33
37
44};
45
46static void
47init_tdr_dsm(void *ptr)
48{
50
51 LWLockInitialize(&dsm->lck, LWLockNewTrancheId("test_dsm_registry"));
52 dsm->val = 0;
53}
54
55static void
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}
71
75{
77
81
83}
84
88{
89 int ret;
90
92
94 ret = tdr_dsm->val;
96
97 PG_RETURN_INT32(ret);
98}
99
101Datum
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}
126
128Datum
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 dsa_free(dsa_area *area, dsa_pointer dp)
Definition: dsa.c:841
uint64 dsa_pointer
Definition: dsa.h:62
#define dsa_allocate(area, size)
Definition: dsa.h:109
void dshash_strcpy(void *dest, const void *src, size_t size, void *arg)
Definition: dshash.c:622
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
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
void * dshash_find_or_insert(dshash_table *hash_table, const void *key, bool *found)
Definition: dshash.c:433
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
int errmsg(const char *fmt,...)
Definition: elog.c:1071
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:150
#define PG_RETURN_VOID()
Definition: fmgr.h:349
#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
#define PG_RETURN_INT32(x)
Definition: fmgr.h:354
#define PG_GETARG_INT32(n)
Definition: fmgr.h:269
#define PG_FUNCTION_ARGS
Definition: fmgr.h:193
long val
Definition: informix.c:689
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1174
int LWLockNewTrancheId(const char *name)
Definition: lwlock.c:596
void LWLockRelease(LWLock *lock)
Definition: lwlock.c:1894
void LWLockInitialize(LWLock *lock, int tranche_id)
Definition: lwlock.c:698
@ LW_SHARED
Definition: lwlock.h:113
@ LW_EXCLUSIVE
Definition: lwlock.h:112
uint64_t Datum
Definition: postgres.h:70
Definition: lwlock.h:42
Definition: dsa.c:348
Definition: c.h:693
static dshash_table * tdr_hash
struct TestDSMRegistryHashEntry TestDSMRegistryHashEntry
Datum set_val_in_shmem(PG_FUNCTION_ARGS)
static void init_tdr_dsm(void *ptr)
PG_MODULE_MAGIC
Datum get_val_in_shmem(PG_FUNCTION_ARGS)
static void tdr_attach_shmem(void)
Datum set_val_in_hash(PG_FUNCTION_ARGS)
static const dshash_parameters dsh_params
static dsa_area * tdr_dsa
Datum get_val_in_hash(PG_FUNCTION_ARGS)
static TestDSMRegistryStruct * tdr_dsm
PG_FUNCTION_INFO_V1(set_val_in_shmem)
struct TestDSMRegistryStruct TestDSMRegistryStruct
text * cstring_to_text(const char *s)
Definition: varlena.c:181