Skip to content

Commit 3fed417

Browse files
committed
Provide a way to predefine LWLock tranche IDs.
It's a bit cumbersome to use LWLockNewTrancheId(), because the returned value needs to be shared between backends so that each backend can call LWLockRegisterTranche() with the correct ID. So, for built-in tranches, use a hard-coded value instead. This is motivated by an upcoming patch adding further built-in tranches. Andres Freund and Robert Haas
1 parent 43cd468 commit 3fed417

File tree

3 files changed

+18
-10
lines changed

3 files changed

+18
-10
lines changed

src/backend/access/transam/xlog.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,6 @@ typedef struct XLogCtlInsert
512512
*/
513513
WALInsertLockPadded *WALInsertLocks;
514514
LWLockTranche WALInsertLockTranche;
515-
int WALInsertLockTrancheId;
516515
} XLogCtlInsert;
517516

518517
/*
@@ -4653,7 +4652,7 @@ XLOGShmemInit(void)
46534652

46544653
/* Initialize local copy of WALInsertLocks and register the tranche */
46554654
WALInsertLocks = XLogCtl->Insert.WALInsertLocks;
4656-
LWLockRegisterTranche(XLogCtl->Insert.WALInsertLockTrancheId,
4655+
LWLockRegisterTranche(LWTRANCHE_WAL_INSERT,
46574656
&XLogCtl->Insert.WALInsertLockTranche);
46584657
return;
46594658
}
@@ -4677,17 +4676,14 @@ XLOGShmemInit(void)
46774676
(WALInsertLockPadded *) allocptr;
46784677
allocptr += sizeof(WALInsertLockPadded) * NUM_XLOGINSERT_LOCKS;
46794678

4680-
XLogCtl->Insert.WALInsertLockTrancheId = LWLockNewTrancheId();
4681-
46824679
XLogCtl->Insert.WALInsertLockTranche.name = "WALInsertLocks";
46834680
XLogCtl->Insert.WALInsertLockTranche.array_base = WALInsertLocks;
46844681
XLogCtl->Insert.WALInsertLockTranche.array_stride = sizeof(WALInsertLockPadded);
46854682

4686-
LWLockRegisterTranche(XLogCtl->Insert.WALInsertLockTrancheId, &XLogCtl->Insert.WALInsertLockTranche);
4683+
LWLockRegisterTranche(LWTRANCHE_WAL_INSERT, &XLogCtl->Insert.WALInsertLockTranche);
46874684
for (i = 0; i < NUM_XLOGINSERT_LOCKS; i++)
46884685
{
4689-
LWLockInitialize(&WALInsertLocks[i].l.lock,
4690-
XLogCtl->Insert.WALInsertLockTrancheId);
4686+
LWLockInitialize(&WALInsertLocks[i].l.lock, LWTRANCHE_WAL_INSERT);
46914687
WALInsertLocks[i].l.insertingAt = InvalidXLogRecPtr;
46924688
}
46934689

src/backend/storage/lmgr/lwlock.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ CreateLWLocks(void)
445445

446446
/* Initialize all LWLocks in main array */
447447
for (id = 0, lock = MainLWLockArray; id < numLocks; id++, lock++)
448-
LWLockInitialize(&lock->lock, 0);
448+
LWLockInitialize(&lock->lock, LWTRANCHE_MAIN);
449449

450450
/*
451451
* Initialize the dynamic-allocation counters, which are stored just
@@ -457,7 +457,7 @@ CreateLWLocks(void)
457457
LWLockCounter = (int *) ((char *) MainLWLockArray - 3 * sizeof(int));
458458
LWLockCounter[0] = NUM_FIXED_LWLOCKS;
459459
LWLockCounter[1] = numLocks;
460-
LWLockCounter[2] = 1; /* 0 is the main array */
460+
LWLockCounter[2] = LWTRANCHE_FIRST_USER_DEFINED;
461461
}
462462

463463
if (LWLockTrancheArray == NULL)
@@ -466,12 +466,13 @@ CreateLWLocks(void)
466466
LWLockTrancheArray = (LWLockTranche **)
467467
MemoryContextAlloc(TopMemoryContext,
468468
LWLockTranchesAllocated * sizeof(LWLockTranche *));
469+
Assert(LWLockTranchesAllocated >= LWTRANCHE_FIRST_USER_DEFINED);
469470
}
470471

471472
MainLWLockTranche.name = "main";
472473
MainLWLockTranche.array_base = MainLWLockArray;
473474
MainLWLockTranche.array_stride = sizeof(LWLockPadded);
474-
LWLockRegisterTranche(0, &MainLWLockTranche);
475+
LWLockRegisterTranche(LWTRANCHE_MAIN, &MainLWLockTranche);
475476
}
476477

477478
/*

src/include/storage/lwlock.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,17 @@ extern int LWLockNewTrancheId(void);
176176
extern void LWLockRegisterTranche(int tranche_id, LWLockTranche *tranche);
177177
extern void LWLockInitialize(LWLock *lock, int tranche_id);
178178

179+
/*
180+
* We reserve a few predefined tranche IDs. A call to LWLockNewTrancheId
181+
* will never return a value less than LWTRANCHE_FIRST_USER_DEFINED.
182+
*/
183+
typedef enum BuiltinTrancheIds
184+
{
185+
LWTRANCHE_MAIN,
186+
LWTRANCHE_WAL_INSERT,
187+
LWTRANCHE_FIRST_USER_DEFINED
188+
} BuiltinTrancheIds;
189+
179190
/*
180191
* Prior to PostgreSQL 9.4, we used an enum type called LWLockId to refer
181192
* to LWLocks. New code should instead use LWLock *. However, for the

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy