v11-0002-Test-module-for-barriers.-NOT-FOR-COMMIT.patch
application/octet-stream
Filename: v11-0002-Test-module-for-barriers.-NOT-FOR-COMMIT.patch
Type: application/octet-stream
Part: 2
Message:
Re: [Patch] ALTER SYSTEM READ ONLY
Patch
Format: format-patch
Series: patch v11-0002
Subject: Test module for barriers. NOT FOR COMMIT.
| File | + | − |
|---|---|---|
| contrib/barrier/barrier--1.0.sql | 14 | 0 |
| contrib/barrier/barrier.c | 63 | 0 |
| contrib/barrier/barrier.control | 5 | 0 |
| contrib/barrier/Makefile | 23 | 0 |
From 15720547e8d3a32603027cd10163eb23d6766696 Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
Date: Wed, 7 Oct 2020 13:04:16 -0400
Subject: [PATCH v11 2/6] 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 00000000000..71f59f6629e
--- /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 00000000000..66cae976a96
--- /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 00000000000..a0b98439924
--- /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 00000000000..425ffc15432
--- /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.18.0