From 219d2fea28e689389cc98c1e8242bd9ecada6318 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 28 Mar 2022 20:49:14 -0700
Subject: [PATCH v68 04/31] dsm: allow use in single user mode.

This is mostly useful for the shared memory stats, to avoid a dedicated code
path for single user mode.
---
 src/backend/storage/ipc/dsm.c      | 9 +++++++--
 src/backend/storage/ipc/dsm_impl.c | 4 +++-
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c
index e9e9fae3eb9..00a8c08ea39 100644
--- a/src/backend/storage/ipc/dsm.c
+++ b/src/backend/storage/ipc/dsm.c
@@ -397,6 +397,7 @@ static void
 dsm_backend_startup(void)
 {
 #ifdef EXEC_BACKEND
+	if (IsUnderPostmaster)
 	{
 		void	   *control_address = NULL;
 
@@ -496,8 +497,12 @@ dsm_create(Size size, int flags)
 	FreePageManager *dsm_main_space_fpm = dsm_main_space_begin;
 	bool		using_main_dsm_region = false;
 
-	/* Unsafe in postmaster (and pointless in a stand-alone backend). */
-	Assert(IsUnderPostmaster);
+	/*
+	 * Unsafe in postmaster. Might seem pointless to allow in single user
+	 * mode, but this way subsystems do not need dedicated single user mode
+	 * paths.
+	 */
+	Assert(IsUnderPostmaster || !IsPostmasterEnvironment);
 
 	if (!dsm_init_done)
 		dsm_backend_startup();
diff --git a/src/backend/storage/ipc/dsm_impl.c b/src/backend/storage/ipc/dsm_impl.c
index 49f4c98620c..6ec865612f1 100644
--- a/src/backend/storage/ipc/dsm_impl.c
+++ b/src/backend/storage/ipc/dsm_impl.c
@@ -959,6 +959,7 @@ dsm_impl_pin_segment(dsm_handle handle, void *impl_private,
 	{
 #ifdef USE_DSM_WINDOWS
 		case DSM_IMPL_WINDOWS:
+			if (IsUnderPostmaster)
 			{
 				HANDLE		hmap;
 
@@ -984,8 +985,8 @@ dsm_impl_pin_segment(dsm_handle handle, void *impl_private,
 				 * is unpinned, dsm_impl_unpin_segment can close it.
 				 */
 				*impl_private_pm_handle = hmap;
-				break;
 			}
+			break;
 #endif
 		default:
 			break;
@@ -1008,6 +1009,7 @@ dsm_impl_unpin_segment(dsm_handle handle, void **impl_private)
 	{
 #ifdef USE_DSM_WINDOWS
 		case DSM_IMPL_WINDOWS:
+			if (IsUnderPostmaster)
 			{
 				if (*impl_private &&
 					!DuplicateHandle(PostmasterHandle, *impl_private,
-- 
2.35.1.677.gabf474a5dd

