From abf7f6042585c6fc45938fd90f964789eade0d6b Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 7 Oct 2020 13:04:16 -0400 Subject: [PATCH 2/2] Test module for barriers. NOT FOR COMMIT. --- contrib/barrier/Makefile | 23 ++++++++++++ contrib/barrier/barrier--1.0.sql | 14 +++++++ contrib/barrier/barrier.c | 63 ++++++++++++++++++++++++++++++++ contrib/barrier/barrier.control | 5 +++ 4 files changed, 105 insertions(+) create mode 100644 contrib/barrier/Makefile create mode 100644 contrib/barrier/barrier--1.0.sql create mode 100644 contrib/barrier/barrier.c create mode 100644 contrib/barrier/barrier.control diff --git a/contrib/barrier/Makefile b/contrib/barrier/Makefile new file mode 100644 index 0000000000..71f59f6629 --- /dev/null +++ b/contrib/barrier/Makefile @@ -0,0 +1,23 @@ +# contrib/barrier/Makefile + +MODULE_big = barrier +OBJS = \ + $(WIN32RES) \ + barrier.o + +EXTENSION = barrier +DATA = barrier--1.0.sql +PGFILEDESC = "barrier - barrier test code NOT FOR COMMIT" + +REGRESS = barrier + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = contrib/barrier +top_builddir = ../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/contrib/barrier/barrier--1.0.sql b/contrib/barrier/barrier--1.0.sql new file mode 100644 index 0000000000..66cae976a9 --- /dev/null +++ b/contrib/barrier/barrier--1.0.sql @@ -0,0 +1,14 @@ +/* contrib/barrier/barrier--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION barrier" to load this file. \quit + +CREATE FUNCTION emit_barrier(barrier_type text, count integer default 1) +RETURNS void +AS 'MODULE_PATHNAME', 'emit_barrier' +LANGUAGE C STRICT; + +CREATE FUNCTION wait_barrier(barrier_type text) +RETURNS void +AS 'MODULE_PATHNAME', 'wait_barrier' +LANGUAGE C STRICT; diff --git a/contrib/barrier/barrier.c b/contrib/barrier/barrier.c new file mode 100644 index 0000000000..a0b9843992 --- /dev/null +++ b/contrib/barrier/barrier.c @@ -0,0 +1,63 @@ +/*------------------------------------------------------------------------- + * + * barrier.c + * emit ProcSignalBarriers for testing purposes + * + * Copyright (c) 2016-2020, PostgreSQL Global Development Group + * + * contrib/barrier/barrier.c + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "funcapi.h" +#include "miscadmin.h" +#include "storage/procsignal.h" +#include "utils/builtins.h" + +PG_MODULE_MAGIC; + +PG_FUNCTION_INFO_V1(emit_barrier); +PG_FUNCTION_INFO_V1(wait_barrier); + +static ProcSignalBarrierType +get_barrier_type(text *barrier_type) +{ + char *btype = text_to_cstring(barrier_type); + + if (strcmp(btype, "placeholder") == 0) + return PROCSIGNAL_BARRIER_PLACEHOLDER; + + elog(ERROR, "unknown barrier type: \"%s\"", btype); +} + +Datum +emit_barrier(PG_FUNCTION_ARGS) +{ + text *barrier_type = PG_GETARG_TEXT_PP(0); + int32 count = PG_GETARG_INT32(1); + int32 i; + ProcSignalBarrierType t = get_barrier_type(barrier_type); + + for (i = 0; i < count; ++i) + { + CHECK_FOR_INTERRUPTS(); + EmitProcSignalBarrier(t); + } + + PG_RETURN_VOID(); +} + +Datum +wait_barrier(PG_FUNCTION_ARGS) +{ + text *barrier_type = PG_GETARG_TEXT_PP(0); + ProcSignalBarrierType t = get_barrier_type(barrier_type); + uint64 generation; + + generation = EmitProcSignalBarrier(t); + elog(NOTICE, "waiting for barrier"); + WaitForProcSignalBarrier(generation); + + PG_RETURN_VOID(); +} diff --git a/contrib/barrier/barrier.control b/contrib/barrier/barrier.control new file mode 100644 index 0000000000..425ffc1543 --- /dev/null +++ b/contrib/barrier/barrier.control @@ -0,0 +1,5 @@ +# barrier extension +comment = 'emit ProcSignalBarrier for test purposes' +default_version = '1.0' +module_pathname = '$libdir/barrier' +relocatable = true -- 2.24.3 (Apple Git-128)