From abf7f6042585c6fc45938fd90f964789eade0d6b Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
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)

