Hi, Attached you can find a short (compile tested only ) patch implementing a 'shared_memory_type' GUC, akin to 'dynamic_shared_memory_type'. Will only apply to 9.4, not 9.3, but it should be easy to convert for it.
Greetings, Andres Freund -- Andres Freund http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
>From e090326d8b5933a162e8e503ccec714bde3a49b7 Mon Sep 17 00:00:00 2001 From: Andres Freund <and...@anarazel.de> Date: Tue, 22 Apr 2014 14:17:34 +0200 Subject: [PATCH] Add shared_memory_type GUC. --- src/backend/port/sysv_shmem.c | 18 ++++++++++++------ src/backend/storage/ipc/ipci.c | 2 ++ src/backend/utils/misc/guc.c | 23 +++++++++++++++++++++++ src/backend/utils/misc/postgresql.conf.sample | 7 ++++++- src/include/storage/pg_shmem.h | 21 +++++++++++++++++++-- 5 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c index 5e3850b..f6343d3 100644 --- a/src/backend/port/sysv_shmem.c +++ b/src/backend/port/sysv_shmem.c @@ -465,14 +465,20 @@ PGSharedMemoryCreate(Size size, bool makePrivate, int port, * developer use, this shouldn't be a big problem. */ #ifndef EXEC_BACKEND - AnonymousShmem = CreateAnonymousSegment(&size); - AnonymousShmemSize = size; + if (shared_memory_type == SHMEM_TYPE_MMAP) + { + AnonymousShmem = CreateAnonymousSegment(&size); + AnonymousShmemSize = size; - /* Now we need only allocate a minimal-sized SysV shmem block. */ - sysvsize = sizeof(PGShmemHeader); -#else - sysvsize = size; + /* Now we need only allocate a minimal-sized SysV shmem block. */ + sysvsize = sizeof(PGShmemHeader); + } + else #endif + { + Assert(shared_memory_type == SHMEM_TYPE_SYSV); + sysvsize = size; + } /* Make sure PGSharedMemoryAttach doesn't fail without need */ UsedShmemSegAddr = NULL; diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c index 4290d2d..c58f171 100644 --- a/src/backend/storage/ipc/ipci.c +++ b/src/backend/storage/ipc/ipci.c @@ -42,6 +42,8 @@ #include "storage/sinvaladt.h" #include "storage/spin.h" +/* GUCs */ +int shared_memory_type = DEFAULT_SHARED_MEMORY_TYPE; shmem_startup_hook_type shmem_startup_hook = NULL; diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index ea54d16..f6d9dc4 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -403,6 +403,19 @@ static const struct config_enum_entry huge_pages_options[] = { {NULL, 0, false} }; +static struct config_enum_entry shared_memory_options[] = { +#ifndef WIN32 + { "sysv", SHMEM_TYPE_SYSV, false}, +#endif +#ifndef EXEC_BACKEND + { "mmap", SHMEM_TYPE_MMAP, false}, +#endif +#ifdef WIN32 + { "windows", SHMEM_TYPE_WINDOWS, false}, +#endif + {NULL, 0, false} +}; + /* * Options for enum values stored in other modules */ @@ -3453,6 +3466,16 @@ static struct config_enum ConfigureNamesEnum[] = }, { + {"shared_memory_type", PGC_POSTMASTER, RESOURCES_MEM, + gettext_noop("Selects the shared memory implementation used."), + NULL + }, + &shared_memory_type, + DEFAULT_SHARED_MEMORY_TYPE, shared_memory_options, + NULL, NULL, NULL + }, + + { {"wal_sync_method", PGC_SIGHUP, WAL_SETTINGS, gettext_noop("Selects the method used for forcing WAL updates to disk."), NULL diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 70e5a51..1c5f02a 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -127,7 +127,12 @@ #maintenance_work_mem = 64MB # min 1MB #autovacuum_work_mem = -1 # min 1MB, or -1 to use maintenance_work_mem #max_stack_depth = 2MB # min 100kB -#dynamic_shared_memory_type = posix # the default is the first option +#shared_memory_type = mmap # the default is the first option + # supported by the operating system: + # mmap + # sysv + # windows +#dynamic_shared_memory_type = posix # the default is the first option # supported by the operating system: # posix # sysv diff --git a/src/include/storage/pg_shmem.h b/src/include/storage/pg_shmem.h index ab28ebe..53ea43a 100644 --- a/src/include/storage/pg_shmem.h +++ b/src/include/storage/pg_shmem.h @@ -41,8 +41,13 @@ typedef struct PGShmemHeader /* standard header for all Postgres shmem */ #endif } PGShmemHeader; -/* GUC variable */ -extern int huge_pages; +/* Possible values for shared_memory_type */ +typedef enum +{ + SHMEM_TYPE_WINDOWS, + SHMEM_TYPE_SYSV, + SHMEM_TYPE_MMAP +} PGShmemType; /* Possible values for huge_pages */ typedef enum @@ -52,6 +57,10 @@ typedef enum HUGE_PAGES_TRY } HugePagesType; +/* GUC variables */ +extern int shared_memory_type; +extern int huge_pages; + #ifndef WIN32 extern unsigned long UsedShmemSegID; #else @@ -59,6 +68,14 @@ extern HANDLE UsedShmemSegID; #endif extern void *UsedShmemSegAddr; +#if !defined(WIN32) && !defined(EXEC_BACKEND) +#define DEFAULT_SHARED_MEMORY_TYPE SHMEM_TYPE_MMAP +#elif !defined(WIN32) +#define DEFAULT_SHARED_MEMORY_TYPE SHMEM_TYPE_SYSV +#else +#define DEFAULT_SHARED_MEMORY_TYPE SHMEM_TYPE_WINDOWS +#endif + #ifdef EXEC_BACKEND extern void PGSharedMemoryReAttach(void); #endif -- 1.8.5.rc2.dirty
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers