From d90c15606897d5d34424881b0ab784b8b6791775 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Thu, 25 Jan 2018 14:03:48 +1300
Subject: [PATCH 2/3] A simple test module that hangs on fork failure.

---
 src/test/modules/test_fork_failure/Makefile        | 18 +++++++
 .../test_fork_failure/test_fork_failure--1.0.sql   |  6 +++
 .../modules/test_fork_failure/test_fork_failure.c  | 55 ++++++++++++++++++++++
 .../test_fork_failure/test_fork_failure.control    |  4 ++
 4 files changed, 83 insertions(+)
 create mode 100644 src/test/modules/test_fork_failure/Makefile
 create mode 100644 src/test/modules/test_fork_failure/test_fork_failure--1.0.sql
 create mode 100644 src/test/modules/test_fork_failure/test_fork_failure.c
 create mode 100644 src/test/modules/test_fork_failure/test_fork_failure.control

diff --git a/src/test/modules/test_fork_failure/Makefile b/src/test/modules/test_fork_failure/Makefile
new file mode 100644
index 00000000000..baffaea0bb5
--- /dev/null
+++ b/src/test/modules/test_fork_failure/Makefile
@@ -0,0 +1,18 @@
+# src/test/modules/test_fork_failure/Makefile
+
+MODULES = test_fork_failure
+
+EXTENSION = test_fork_failure
+DATA = test_fork_failure--1.0.sql
+PGFILEDESC = "test_fork_failure -- throw-away test code"
+
+ifdef USE_PGXS
+PG_CONFIG = pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+else
+subdir = src/test/modules/test_fork_failure
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+include $(top_srcdir)/contrib/contrib-global.mk
+endif
diff --git a/src/test/modules/test_fork_failure/test_fork_failure--1.0.sql b/src/test/modules/test_fork_failure/test_fork_failure--1.0.sql
new file mode 100644
index 00000000000..b40c89c1fe9
--- /dev/null
+++ b/src/test/modules/test_fork_failure/test_fork_failure--1.0.sql
@@ -0,0 +1,6 @@
+\echo Use "CREATE EXTENSION test_fork_failure" to load this file. \quit
+
+CREATE PROCEDURE test_fork_failure()
+AS 'MODULE_PATHNAME'
+LANGUAGE C;
+
diff --git a/src/test/modules/test_fork_failure/test_fork_failure.c b/src/test/modules/test_fork_failure/test_fork_failure.c
new file mode 100644
index 00000000000..ef86385d4a0
--- /dev/null
+++ b/src/test/modules/test_fork_failure/test_fork_failure.c
@@ -0,0 +1,55 @@
+#include "postgres.h"
+
+#include "access/parallel.h"
+#include "access/xact.h"
+#include "fmgr.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "pgstat.h"
+#include "storage/condition_variable.h"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(test_fork_failure);
+
+#define MY_KEY 42
+
+extern void test_fork_failure_main(dsm_segment *seg, shm_toc *toc);
+
+void
+test_fork_failure_main(dsm_segment *seg, shm_toc *toc)
+{
+	ConditionVariable *cv;
+
+	cv = (ConditionVariable *) shm_toc_lookup(toc, MY_KEY, false);
+	ConditionVariableSignal(cv);
+}
+
+Datum
+test_fork_failure(PG_FUNCTION_ARGS)
+{
+	ConditionVariable *cv;
+	ParallelContext *pc;
+
+	EnterParallelMode();
+	pc = CreateParallelContext("test_fork_failure", "test_fork_failure_main", 1);
+	shm_toc_estimate_chunk(&pc->estimator, sizeof(ConditionVariable));
+	shm_toc_estimate_keys(&pc->estimator, 1);
+	InitializeParallelDSM(pc);
+	if (pc->seg == NULL)
+		elog(ERROR, "cannot create DSM segment");
+	cv = (ConditionVariable *) shm_toc_allocate(pc->toc,sizeof(ConditionVariable));
+	ConditionVariableInit(cv);
+	shm_toc_insert(pc->toc, MY_KEY, cv);
+
+	ConditionVariablePrepareToSleep(cv);
+	LaunchParallelWorkers(pc);
+	ConditionVariableSleep(cv, PG_WAIT_EXTENSION);
+	ConditionVariableCancelSleep();
+
+	WaitForParallelWorkersToFinish(pc);
+	DestroyParallelContext(pc);
+	ExitParallelMode();
+
+	return (Datum) 0;
+}
diff --git a/src/test/modules/test_fork_failure/test_fork_failure.control b/src/test/modules/test_fork_failure/test_fork_failure.control
new file mode 100644
index 00000000000..2842622bea1
--- /dev/null
+++ b/src/test/modules/test_fork_failure/test_fork_failure.control
@@ -0,0 +1,4 @@
+comment = 'test_fork_failure'
+default_version = '1.0'
+module_pathname = '$libdir/test_fork_failure'
+relocatable = true
-- 
2.15.1

