dsm-handle-invalid.patch

application/octet-stream

Filename: dsm-handle-invalid.patch
Type: application/octet-stream
Part: 0
Message: Dynamic shared memory areas

Patch

Format: unified
File+
src/backend/storage/ipc/dsm.c 3 1
src/include/storage/dsm.h 3 0
commit feab191ea1be8a75e3bd430a3476f26582d3673c
Author: Robert Haas <robert.haas@enterprisedb.com>
Date:   Wed May 25 09:38:48 2016 -0400

    Reserve zero as an invalid DSM handle.
    
    Previously, the handle for the control segment could not be zero, but
    some other DSM segment could potentially have a handle value of zero.
    However, that means that if you want to store a dsm_handle that might
    or might not be valid, you need a separate boolean to keep track of
    whether you've got a legal value there.  That's annoying, so change
    things so that no DSM segment can ever have a handle of 0 - or as we
    call it here, DSM_HANDLE_INVALID.
    
    Thomas Munro, reviewed by me.

diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c
index fae0b00..0dd1ed4 100644
--- a/src/backend/storage/ipc/dsm.c
+++ b/src/backend/storage/ipc/dsm.c
@@ -181,7 +181,7 @@ dsm_postmaster_startup(PGShmemHeader *shim)
 		Assert(dsm_control_address == NULL);
 		Assert(dsm_control_mapped_size == 0);
 		dsm_control_handle = random();
-		if (dsm_control_handle == 0)
+		if (dsm_control_handle == DSM_HANDLE_INVALID)
 			continue;
 		if (dsm_impl_op(DSM_OP_CREATE, dsm_control_handle, segsize,
 						&dsm_control_impl_private, &dsm_control_address,
@@ -475,6 +475,8 @@ dsm_create(Size size, int flags)
 	{
 		Assert(seg->mapped_address == NULL && seg->mapped_size == 0);
 		seg->handle = random();
+		if (seg->handle == DSM_HANDLE_INVALID)	/* Reserve sentinel */
+			continue;
 		if (dsm_impl_op(DSM_OP_CREATE, seg->handle, size, &seg->impl_private,
 						&seg->mapped_address, &seg->mapped_size, ERROR))
 			break;
diff --git a/src/include/storage/dsm.h b/src/include/storage/dsm.h
index 8be7c9a..bc91be6 100644
--- a/src/include/storage/dsm.h
+++ b/src/include/storage/dsm.h
@@ -19,6 +19,9 @@ typedef struct dsm_segment dsm_segment;
 
 #define DSM_CREATE_NULL_IF_MAXSEGMENTS			0x0001
 
+/* A sentinel value for an invalid DSM handle. */
+#define DSM_HANDLE_INVALID 0
+
 /* Startup and shutdown functions. */
 struct PGShmemHeader;			/* avoid including pg_shmem.h */
 extern void dsm_cleanup_using_control_segment(dsm_handle old_control_handle);