diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c index abfee48317..302f929624 100644 --- a/src/backend/access/transam/varsup.c +++ b/src/backend/access/transam/varsup.c @@ -34,6 +34,33 @@ VariableCache ShmemVariableCache = NULL; +/* + * Initialization of shared memory for ShmemVariableCache. + */ +Size +VarsupShmemSize(void) +{ + return sizeof(VariableCacheData); +} + +void +VarsupShmemInit(void) +{ + bool found; + + /* Initialize our shared state struct */ + ShmemVariableCache = ShmemInitStruct("ShmemVariableCache", + sizeof(VariableCacheData), + &found); + if (!IsUnderPostmaster) + { + Assert(!found); + memset(ShmemVariableCache, 0, sizeof(VariableCacheData)); + } + else + Assert(found); +} + /* * Allocate the next FullTransactionId for a new transaction or * subtransaction. diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index ae31d66930..023a772c49 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -89,7 +89,6 @@ #include #endif -#include "access/transam.h" #include "access/xlog.h" #include "access/xlogrecovery.h" #include "catalog/pg_control.h" @@ -513,7 +512,6 @@ typedef struct #endif void *UsedShmemSegAddr; slock_t *ShmemLock; - VariableCache ShmemVariableCache; Backend *ShmemBackendArray; #ifndef HAVE_SPINLOCKS PGSemaphore *SpinlockSemaArray; @@ -6034,7 +6032,6 @@ save_backend_variables(BackendParameters *param, Port *port, BackgroundWorker *w param->UsedShmemSegAddr = UsedShmemSegAddr; param->ShmemLock = ShmemLock; - param->ShmemVariableCache = ShmemVariableCache; param->ShmemBackendArray = ShmemBackendArray; #ifndef HAVE_SPINLOCKS @@ -6280,7 +6277,6 @@ restore_backend_variables(BackendParameters *param, Port **port, BackgroundWorke UsedShmemSegAddr = param->UsedShmemSegAddr; ShmemLock = param->ShmemLock; - ShmemVariableCache = param->ShmemVariableCache; ShmemBackendArray = param->ShmemBackendArray; #ifndef HAVE_SPINLOCKS diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c index 2225a4a6e6..0e0ac22bdd 100644 --- a/src/backend/storage/ipc/ipci.c +++ b/src/backend/storage/ipc/ipci.c @@ -21,6 +21,7 @@ #include "access/nbtree.h" #include "access/subtrans.h" #include "access/syncscan.h" +#include "access/transam.h" #include "access/twophase.h" #include "access/xlogprefetcher.h" #include "access/xlogrecovery.h" @@ -118,6 +119,7 @@ CalculateShmemSize(int *num_semaphores) size = add_size(size, PredicateLockShmemSize()); size = add_size(size, ProcGlobalShmemSize()); size = add_size(size, XLogPrefetchShmemSize()); + size = add_size(size, VarsupShmemSize()); size = add_size(size, XLOGShmemSize()); size = add_size(size, XLogRecoveryShmemSize()); size = add_size(size, CLOGShmemSize()); @@ -289,6 +291,7 @@ CreateOrAttachShmemStructs(void) /* * Set up xlog, clog, and buffers */ + VarsupShmemInit(); XLOGShmemInit(); XLogPrefetchShmemInit(); XLogRecoveryShmemInit(); diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c index 5465fa1964..52818fd1bd 100644 --- a/src/backend/storage/ipc/shmem.c +++ b/src/backend/storage/ipc/shmem.c @@ -140,14 +140,6 @@ InitShmemAllocation(void) /* ShmemIndex can't be set up yet (need LWLocks first) */ shmhdr->index = NULL; ShmemIndex = (HTAB *) NULL; - - /* - * Initialize ShmemVariableCache for transaction manager. (This doesn't - * really belong here, but not worth moving.) - */ - ShmemVariableCache = (VariableCache) - ShmemAlloc(sizeof(*ShmemVariableCache)); - memset(ShmemVariableCache, 0, sizeof(*ShmemVariableCache)); } /* diff --git a/src/include/access/transam.h b/src/include/access/transam.h index f5af6d3055..a4654f6c31 100644 --- a/src/include/access/transam.h +++ b/src/include/access/transam.h @@ -285,6 +285,8 @@ extern TransactionId TransactionIdLatest(TransactionId mainxid, extern XLogRecPtr TransactionIdGetCommitLSN(TransactionId xid); /* in transam/varsup.c */ +extern Size VarsupShmemSize(void); +extern void VarsupShmemInit(void); extern FullTransactionId GetNewTransactionId(bool isSubXact); extern void AdvanceNextFullTransactionIdPastXid(TransactionId xid); extern FullTransactionId ReadNextFullTransactionId(void);