Age Owner Branch data TLA Line data Source code
1 : : /*--------------------------------------------------------------------------
2 : : *
3 : : * test_dsm_registry.c
4 : : * Test the dynamic shared memory registry.
5 : : *
6 : : * Copyright (c) 2024, 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 : :
86 nathan@postgresql.or 19 :GNC 2 : PG_MODULE_MAGIC;
20 : :
21 : : typedef struct TestDSMRegistryStruct
22 : : {
23 : : int val;
24 : : LWLock lck;
25 : : } TestDSMRegistryStruct;
26 : :
27 : : static TestDSMRegistryStruct *tdr_state;
28 : :
29 : : static void
30 : 1 : tdr_init_shmem(void *ptr)
31 : : {
32 : 1 : TestDSMRegistryStruct *state = (TestDSMRegistryStruct *) ptr;
33 : :
34 : 1 : LWLockInitialize(&state->lck, LWLockNewTrancheId());
35 : 1 : state->val = 0;
36 : 1 : }
37 : :
38 : : static void
39 : 2 : tdr_attach_shmem(void)
40 : : {
41 : : bool found;
42 : :
43 : 2 : tdr_state = GetNamedDSMSegment("test_dsm_registry",
44 : : sizeof(TestDSMRegistryStruct),
45 : : tdr_init_shmem,
46 : : &found);
47 : 2 : LWLockRegisterTranche(tdr_state->lck.tranche, "test_dsm_registry");
48 : 2 : }
49 : :
50 : 2 : PG_FUNCTION_INFO_V1(set_val_in_shmem);
51 : : Datum
52 : 1 : set_val_in_shmem(PG_FUNCTION_ARGS)
53 : : {
54 : 1 : tdr_attach_shmem();
55 : :
56 : 1 : LWLockAcquire(&tdr_state->lck, LW_EXCLUSIVE);
57 : 1 : tdr_state->val = PG_GETARG_UINT32(0);
58 : 1 : LWLockRelease(&tdr_state->lck);
59 : :
60 : 1 : PG_RETURN_VOID();
61 : : }
62 : :
63 : 2 : PG_FUNCTION_INFO_V1(get_val_in_shmem);
64 : : Datum
65 : 1 : get_val_in_shmem(PG_FUNCTION_ARGS)
66 : : {
67 : : int ret;
68 : :
69 : 1 : tdr_attach_shmem();
70 : :
71 : 1 : LWLockAcquire(&tdr_state->lck, LW_SHARED);
72 : 1 : ret = tdr_state->val;
73 : 1 : LWLockRelease(&tdr_state->lck);
74 : :
75 : 1 : PG_RETURN_UINT32(ret);
76 : : }
|