summaryrefslogtreecommitdiff
path: root/src/include/utils/dsa.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/utils/dsa.h')
-rw-r--r--src/include/utils/dsa.h23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/include/utils/dsa.h b/src/include/utils/dsa.h
index a6d674df577..0e2778c95d7 100644
--- a/src/include/utils/dsa.h
+++ b/src/include/utils/dsa.h
@@ -24,20 +24,25 @@ struct dsa_area;
typedef struct dsa_area dsa_area;
/*
- * If this system doesn't support atomic operations on 64 bit values then
- * we fall back to 32 bit dsa_pointer. For testing purposes,
- * USE_SMALL_DSA_POINTER can be defined to force the use of 32 bit
- * dsa_pointer even on systems that support 64 bit atomics.
+ * If this system only uses a 32-bit value for Size, then use the 32-bit
+ * implementation of DSA. This limits the amount of DSA that can be created
+ * to something significantly less than the entire 4GB address space because
+ * the DSA pointer must encode both a segment identifier and an offset, but
+ * that shouldn't be a significant limitation in practice.
+ *
+ * If this system doesn't support atomic operations on 64-bit values, then
+ * we fall back to 32-bit dsa_pointer for lack of other options.
+ *
+ * For testing purposes, USE_SMALL_DSA_POINTER can be defined to force the use
+ * of 32-bit dsa_pointer even on systems capable of supporting a 64-bit
+ * dsa_pointer.
*/
-#ifndef PG_HAVE_ATOMIC_U64_SUPPORT
-#define SIZEOF_DSA_POINTER 4
-#else
-#ifdef USE_SMALL_DSA_POINTER
+#if SIZEOF_SIZE_T == 4 || !defined(PG_HAVE_ATOMIC_U64_SUPPORT) || \
+ defined(USE_SMALL_DSA_POINTER)
#define SIZEOF_DSA_POINTER 4
#else
#define SIZEOF_DSA_POINTER 8
#endif
-#endif
/*
* The type of 'relative pointers' to memory allocated by a dynamic shared