diff options
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/modules/Makefile | 1 | ||||
-rw-r--r-- | src/test/modules/meson.build | 1 | ||||
-rw-r--r-- | src/test/modules/test_dsm_registry/.gitignore | 4 | ||||
-rw-r--r-- | src/test/modules/test_dsm_registry/Makefile | 23 | ||||
-rw-r--r-- | src/test/modules/test_dsm_registry/expected/test_dsm_registry.out | 14 | ||||
-rw-r--r-- | src/test/modules/test_dsm_registry/meson.build | 33 | ||||
-rw-r--r-- | src/test/modules/test_dsm_registry/sql/test_dsm_registry.sql | 4 | ||||
-rw-r--r-- | src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql | 10 | ||||
-rw-r--r-- | src/test/modules/test_dsm_registry/test_dsm_registry.c | 76 | ||||
-rw-r--r-- | src/test/modules/test_dsm_registry/test_dsm_registry.control | 4 |
10 files changed, 170 insertions, 0 deletions
diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile index 5d33fa6a9a8..f656032589d 100644 --- a/src/test/modules/Makefile +++ b/src/test/modules/Makefile @@ -18,6 +18,7 @@ SUBDIRS = \ test_custom_rmgrs \ test_ddl_deparse \ test_dsa \ + test_dsm_registry \ test_extensions \ test_ginpostinglist \ test_integerset \ diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build index 00ff1d77d19..2c3b8d73bce 100644 --- a/src/test/modules/meson.build +++ b/src/test/modules/meson.build @@ -15,6 +15,7 @@ subdir('test_copy_callbacks') subdir('test_custom_rmgrs') subdir('test_ddl_deparse') subdir('test_dsa') +subdir('test_dsm_registry') subdir('test_extensions') subdir('test_ginpostinglist') subdir('test_integerset') diff --git a/src/test/modules/test_dsm_registry/.gitignore b/src/test/modules/test_dsm_registry/.gitignore new file mode 100644 index 00000000000..5dcb3ff9723 --- /dev/null +++ b/src/test/modules/test_dsm_registry/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/src/test/modules/test_dsm_registry/Makefile b/src/test/modules/test_dsm_registry/Makefile new file mode 100644 index 00000000000..b13e99a354f --- /dev/null +++ b/src/test/modules/test_dsm_registry/Makefile @@ -0,0 +1,23 @@ +# src/test/modules/test_dsm_registry/Makefile + +MODULE_big = test_dsm_registry +OBJS = \ + $(WIN32RES) \ + test_dsm_registry.o +PGFILEDESC = "test_dsm_registry - test code for the DSM registry" + +EXTENSION = test_dsm_registry +DATA = test_dsm_registry--1.0.sql + +REGRESS = test_dsm_registry + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/test_dsm_registry +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/src/test/modules/test_dsm_registry/expected/test_dsm_registry.out b/src/test/modules/test_dsm_registry/expected/test_dsm_registry.out new file mode 100644 index 00000000000..8ffbd343a05 --- /dev/null +++ b/src/test/modules/test_dsm_registry/expected/test_dsm_registry.out @@ -0,0 +1,14 @@ +CREATE EXTENSION test_dsm_registry; +SELECT set_val_in_shmem(1236); + set_val_in_shmem +------------------ + +(1 row) + +\c +SELECT get_val_in_shmem(); + get_val_in_shmem +------------------ + 1236 +(1 row) + diff --git a/src/test/modules/test_dsm_registry/meson.build b/src/test/modules/test_dsm_registry/meson.build new file mode 100644 index 00000000000..a4045fea37e --- /dev/null +++ b/src/test/modules/test_dsm_registry/meson.build @@ -0,0 +1,33 @@ +# Copyright (c) 2024, PostgreSQL Global Development Group + +test_dsm_registry_sources = files( + 'test_dsm_registry.c', +) + +if host_system == 'windows' + test_dsm_registry_sources += rc_lib_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'test_dsm_registry', + '--FILEDESC', 'test_dsm_registry - test code for the DSM registry',]) +endif + +test_dsm_registry = shared_module('test_dsm_registry', + test_dsm_registry_sources, + kwargs: pg_test_mod_args, +) +test_install_libs += test_dsm_registry + +test_install_data += files( + 'test_dsm_registry.control', + 'test_dsm_registry--1.0.sql', +) + +tests += { + 'name': 'test_dsm_registry', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'regress': { + 'sql': [ + 'test_dsm_registry', + ], + }, +} diff --git a/src/test/modules/test_dsm_registry/sql/test_dsm_registry.sql b/src/test/modules/test_dsm_registry/sql/test_dsm_registry.sql new file mode 100644 index 00000000000..b3351be0a16 --- /dev/null +++ b/src/test/modules/test_dsm_registry/sql/test_dsm_registry.sql @@ -0,0 +1,4 @@ +CREATE EXTENSION test_dsm_registry; +SELECT set_val_in_shmem(1236); +\c +SELECT get_val_in_shmem(); diff --git a/src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql b/src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql new file mode 100644 index 00000000000..8c55b0919b1 --- /dev/null +++ b/src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql @@ -0,0 +1,10 @@ +/* src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION test_dsm_registry" to load this file. \quit + +CREATE FUNCTION set_val_in_shmem(val INT) RETURNS VOID + AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION get_val_in_shmem() RETURNS INT + AS 'MODULE_PATHNAME' LANGUAGE C; diff --git a/src/test/modules/test_dsm_registry/test_dsm_registry.c b/src/test/modules/test_dsm_registry/test_dsm_registry.c new file mode 100644 index 00000000000..96eaa850bfa --- /dev/null +++ b/src/test/modules/test_dsm_registry/test_dsm_registry.c @@ -0,0 +1,76 @@ +/*-------------------------------------------------------------------------- + * + * test_dsm_registry.c + * Test the dynamic shared memory registry. + * + * Copyright (c) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_dsm_registry/test_dsm_registry.c + * + * ------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "fmgr.h" +#include "storage/dsm_registry.h" +#include "storage/lwlock.h" + +PG_MODULE_MAGIC; + +typedef struct TestDSMRegistryStruct +{ + int val; + LWLock lck; +} TestDSMRegistryStruct; + +static TestDSMRegistryStruct *tdr_state; + +static void +tdr_init_shmem(void *ptr) +{ + TestDSMRegistryStruct *state = (TestDSMRegistryStruct *) ptr; + + LWLockInitialize(&state->lck, LWLockNewTrancheId()); + state->val = 0; +} + +static void +tdr_attach_shmem(void) +{ + bool found; + + tdr_state = GetNamedDSMSegment("test_dsm_registry", + sizeof(TestDSMRegistryStruct), + tdr_init_shmem, + &found); + LWLockRegisterTranche(tdr_state->lck.tranche, "test_dsm_registry"); +} + +PG_FUNCTION_INFO_V1(set_val_in_shmem); +Datum +set_val_in_shmem(PG_FUNCTION_ARGS) +{ + tdr_attach_shmem(); + + LWLockAcquire(&tdr_state->lck, LW_EXCLUSIVE); + tdr_state->val = PG_GETARG_UINT32(0); + LWLockRelease(&tdr_state->lck); + + PG_RETURN_VOID(); +} + +PG_FUNCTION_INFO_V1(get_val_in_shmem); +Datum +get_val_in_shmem(PG_FUNCTION_ARGS) +{ + int ret; + + tdr_attach_shmem(); + + LWLockAcquire(&tdr_state->lck, LW_SHARED); + ret = tdr_state->val; + LWLockRelease(&tdr_state->lck); + + PG_RETURN_UINT32(ret); +} diff --git a/src/test/modules/test_dsm_registry/test_dsm_registry.control b/src/test/modules/test_dsm_registry/test_dsm_registry.control new file mode 100644 index 00000000000..813f099889b --- /dev/null +++ b/src/test/modules/test_dsm_registry/test_dsm_registry.control @@ -0,0 +1,4 @@ +comment = 'Test code for the DSM registry' +default_version = '1.0' +module_pathname = '$libdir/test_dsm_registry' +relocatable = true |