aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/storage/ipc/ipci.c4
-rw-r--r--src/backend/storage/lmgr/lock.c35
-rw-r--r--src/backend/utils/init/postinit.c3
-rw-r--r--src/include/storage/lock.h5
4 files changed, 25 insertions, 22 deletions
diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c
index 35fa2e1dda6..8f8a89124e8 100644
--- a/src/backend/storage/ipc/ipci.c
+++ b/src/backend/storage/ipc/ipci.c
@@ -116,7 +116,7 @@ CalculateShmemSize(int *num_semaphores)
size = add_size(size, dsm_estimate_size());
size = add_size(size, DSMRegistryShmemSize());
size = add_size(size, BufferShmemSize());
- size = add_size(size, LockShmemSize());
+ size = add_size(size, LockManagerShmemSize());
size = add_size(size, PredicateLockShmemSize());
size = add_size(size, ProcGlobalShmemSize());
size = add_size(size, XLogPrefetchShmemSize());
@@ -291,7 +291,7 @@ CreateOrAttachShmemStructs(void)
/*
* Set up lock manager
*/
- InitLocks();
+ LockManagerShmemInit();
/*
* Set up predicate lock manager
diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
index 0400a507779..6dbc41dae70 100644
--- a/src/backend/storage/lmgr/lock.c
+++ b/src/backend/storage/lmgr/lock.c
@@ -377,19 +377,17 @@ static void GetSingleProcBlockerStatusData(PGPROC *blocked_proc,
/*
- * InitLocks -- Initialize the lock manager's data structures.
+ * Initialize the lock manager's shmem data structures.
*
- * This is called from CreateSharedMemoryAndSemaphores(), which see for
- * more comments. In the normal postmaster case, the shared hash tables
- * are created here, as well as a locallock hash table that will remain
- * unused and empty in the postmaster itself. Backends inherit the pointers
- * to the shared tables via fork(), and also inherit an image of the locallock
- * hash table, which they proceed to use. In the EXEC_BACKEND case, each
- * backend re-executes this code to obtain pointers to the already existing
- * shared hash tables and to create its locallock hash table.
+ * This is called from CreateSharedMemoryAndSemaphores(), which see for more
+ * comments. In the normal postmaster case, the shared hash tables are
+ * created here, and backends inherit pointers to them via fork(). In the
+ * EXEC_BACKEND case, each backend re-executes this code to obtain pointers to
+ * the already existing shared hash tables. In either case, each backend must
+ * also call InitLockManagerAccess() to create the locallock hash table.
*/
void
-InitLocks(void)
+LockManagerShmemInit(void)
{
HASHCTL info;
long init_table_size,
@@ -444,18 +442,19 @@ InitLocks(void)
sizeof(FastPathStrongRelationLockData), &found);
if (!found)
SpinLockInit(&FastPathStrongRelationLocks->mutex);
+}
+/*
+ * Initialize the lock manager's backend-private data structures.
+ */
+void
+InitLockManagerAccess(void)
+{
/*
* Allocate non-shared hash table for LOCALLOCK structs. This stores lock
* counts and resource owner information.
- *
- * The non-shared table could already exist in this process (this occurs
- * when the postmaster is recreating shared memory after a backend crash).
- * If so, delete and recreate it. (We could simply leave it, since it
- * ought to be empty in the postmaster, but for safety let's zap it.)
*/
- if (LockMethodLocalHash)
- hash_destroy(LockMethodLocalHash);
+ HASHCTL info;
info.keysize = sizeof(LOCALLOCKTAG);
info.entrysize = sizeof(LOCALLOCK);
@@ -3571,7 +3570,7 @@ PostPrepare_Locks(TransactionId xid)
* Estimate shared-memory space used for lock tables
*/
Size
-LockShmemSize(void)
+LockManagerShmemSize(void)
{
Size size = 0;
long max_table_size;
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index 13524ea488a..04a47d6e704 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -606,6 +606,9 @@ BaseInit(void)
*/
InitXLogInsert();
+ /* Initialize lock manager's local structs */
+ InitLockManagerAccess();
+
/*
* Initialize replication slots after pgstat. The exit hook might need to
* drop ephemeral slots, which in turn triggers stats reporting.
diff --git a/src/include/storage/lock.h b/src/include/storage/lock.h
index cc1f6e78c39..8b328a06d9e 100644
--- a/src/include/storage/lock.h
+++ b/src/include/storage/lock.h
@@ -544,7 +544,9 @@ typedef enum
/*
* function prototypes
*/
-extern void InitLocks(void);
+extern void LockManagerShmemInit(void);
+extern Size LockManagerShmemSize(void);
+extern void InitLockManagerAccess(void);
extern LockMethod GetLocksMethodTable(const LOCK *lock);
extern LockMethod GetLockTagsMethodTable(const LOCKTAG *locktag);
extern uint32 LockTagHashCode(const LOCKTAG *locktag);
@@ -584,7 +586,6 @@ extern bool LockCheckConflicts(LockMethod lockMethodTable,
extern void GrantLock(LOCK *lock, PROCLOCK *proclock, LOCKMODE lockmode);
extern void GrantAwaitedLock(void);
extern void RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode);
-extern Size LockShmemSize(void);
extern LockData *GetLockStatusData(void);
extern BlockedProcsData *GetBlockerStatusData(int blocked_pid);