PostgreSQL Source Code: src/test/modules/test_dsm_registry/test_dsm_registry.c Source File

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"
16#include "storage/dsm_registry.h"
17#include "storage/lwlock.h"
18#include "utils/builtins.h"
19
20 PG_MODULE_MAGIC;
21
22 typedef struct TestDSMRegistryStruct
23{
24 int val;
25 LWLock lck;
26 } TestDSMRegistryStruct;
27
28 typedef struct TestDSMRegistryHashEntry
29{
30 char key[64];
31 dsa_pointer val;
32 } TestDSMRegistryHashEntry;
33
34 static TestDSMRegistryStruct *tdr_dsm;
35 static dsa_area *tdr_dsa;
36 static dshash_table *tdr_hash;
37
38 static const dshash_parameters dsh_params = {
39 offsetof(TestDSMRegistryHashEntry, val),
40 sizeof(TestDSMRegistryHashEntry),
41 dshash_strcmp,
42 dshash_strhash,
43 dshash_strcpy
44};
45
46static void
47 init_tdr_dsm(void *ptr)
48{
49 TestDSMRegistryStruct *dsm = (TestDSMRegistryStruct *) ptr;
50
51 LWLockInitialize(&dsm->lck, LWLockNewTrancheId("test_dsm_registry"));
52 dsm->val = 0;
53}
54
55static void
56 tdr_attach_shmem(void)
57{
58 bool found;
59
60 tdr_dsm = GetNamedDSMSegment("test_dsm_registry_dsm",
61 sizeof(TestDSMRegistryStruct),
62 init_tdr_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
72 PG_FUNCTION_INFO_V1(set_val_in_shmem);
73Datum
74 set_val_in_shmem(PG_FUNCTION_ARGS)
75{
76 tdr_attach_shmem();
77
78 LWLockAcquire(&tdr_dsm->lck, LW_EXCLUSIVE);
79 tdr_dsm->val = PG_GETARG_INT32(0);
80 LWLockRelease(&tdr_dsm->lck);
81
82 PG_RETURN_VOID();
83}
84
85 PG_FUNCTION_INFO_V1(get_val_in_shmem);
86Datum
87 get_val_in_shmem(PG_FUNCTION_ARGS)
88{
89 int ret;
90
91 tdr_attach_shmem();
92
93 LWLockAcquire(&tdr_dsm->lck, LW_SHARED);
94 ret = tdr_dsm->val;
95 LWLockRelease(&tdr_dsm->lck);
96
97 PG_RETURN_INT32(ret);
98}
99
100 PG_FUNCTION_INFO_V1(set_val_in_hash);
101Datum
102 set_val_in_hash(PG_FUNCTION_ARGS)
103{
104 TestDSMRegistryHashEntry *entry;
105 char *key = TextDatumGetCString(PG_GETARG_DATUM(0));
106 char *val = TextDatumGetCString(PG_GETARG_DATUM(1));
107 bool found;
108
109 if (strlen(key) >= offsetof(TestDSMRegistryHashEntry, val))
110 ereport(ERROR,
111 (errmsg("key too long")));
112
113 tdr_attach_shmem();
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
122 dshash_release_lock(tdr_hash, entry);
123
124 PG_RETURN_VOID();
125}
126
127 PG_FUNCTION_INFO_V1(get_val_in_hash);
128Datum
129 get_val_in_hash(PG_FUNCTION_ARGS)
130{
131 TestDSMRegistryHashEntry *entry;
132 char *key = TextDatumGetCString(PG_GETARG_DATUM(0));
133 text *val = NULL;
134
135 tdr_attach_shmem();
136
137 entry = dshash_find(tdr_hash, key, false);
138 if (entry == NULL)
139 PG_RETURN_NULL();
140
141 val = cstring_to_text(dsa_get_address(tdr_dsa, entry->val));
142
143 dshash_release_lock(tdr_hash, entry);
144
145 PG_RETURN_TEXT_P(val);
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:692
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

AltStyle によって変換されたページ (->オリジナル) /