diff options
Diffstat (limited to 'src/backend/access/transam/slru.c')
-rw-r--r-- | src/backend/access/transam/slru.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c index 90c7cf56e63..08979006275 100644 --- a/src/backend/access/transam/slru.c +++ b/src/backend/access/transam/slru.c @@ -152,7 +152,7 @@ SimpleLruShmemSize(int nslots, int nlsns) sz += MAXALIGN(nslots * sizeof(bool)); /* page_dirty[] */ sz += MAXALIGN(nslots * sizeof(int)); /* page_number[] */ sz += MAXALIGN(nslots * sizeof(int)); /* page_lru_count[] */ - sz += MAXALIGN(nslots * sizeof(LWLock *)); /* buffer_locks[] */ + sz += MAXALIGN(nslots * sizeof(LWLockPadded)); /* buffer_locks[] */ if (nlsns > 0) sz += MAXALIGN(nslots * nlsns * sizeof(XLogRecPtr)); /* group_lsn[] */ @@ -203,8 +203,6 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, offset += MAXALIGN(nslots * sizeof(int)); shared->page_lru_count = (int *) (ptr + offset); offset += MAXALIGN(nslots * sizeof(int)); - shared->buffer_locks = (LWLock **) (ptr + offset); - offset += MAXALIGN(nslots * sizeof(LWLock *)); if (nlsns > 0) { @@ -212,20 +210,35 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, offset += MAXALIGN(nslots * nlsns * sizeof(XLogRecPtr)); } + /* Initialize LWLocks */ + shared->buffer_locks = (LWLockPadded *) ShmemAlloc(sizeof(LWLockPadded) * nslots); + + Assert(strlen(name) + 1 < SLRU_MAX_NAME_LENGTH); + strlcpy(shared->lwlock_tranche_name, name, SLRU_MAX_NAME_LENGTH); + shared->lwlock_tranche_id = LWLockNewTrancheId(); + shared->lwlock_tranche.name = shared->lwlock_tranche_name; + shared->lwlock_tranche.array_base = shared->buffer_locks; + shared->lwlock_tranche.array_stride = sizeof(LWLockPadded); + ptr += BUFFERALIGN(offset); for (slotno = 0; slotno < nslots; slotno++) { + LWLockInitialize(&shared->buffer_locks[slotno].lock, + shared->lwlock_tranche_id); + shared->page_buffer[slotno] = ptr; shared->page_status[slotno] = SLRU_PAGE_EMPTY; shared->page_dirty[slotno] = false; shared->page_lru_count[slotno] = 0; - shared->buffer_locks[slotno] = LWLockAssign(); ptr += BLCKSZ; } } else Assert(found); + /* Register SLRU tranche in the main tranches array */ + LWLockRegisterTranche(shared->lwlock_tranche_id, &shared->lwlock_tranche); + /* * Initialize the unshared control struct, including directory path. We * assume caller set PagePrecedes. @@ -308,8 +321,8 @@ SimpleLruWaitIO(SlruCtl ctl, int slotno) /* See notes at top of file */ LWLockRelease(shared->ControlLock); - LWLockAcquire(shared->buffer_locks[slotno], LW_SHARED); - LWLockRelease(shared->buffer_locks[slotno]); + LWLockAcquire(&shared->buffer_locks[slotno].lock, LW_SHARED); + LWLockRelease(&shared->buffer_locks[slotno].lock); LWLockAcquire(shared->ControlLock, LW_EXCLUSIVE); /* @@ -323,7 +336,7 @@ SimpleLruWaitIO(SlruCtl ctl, int slotno) if (shared->page_status[slotno] == SLRU_PAGE_READ_IN_PROGRESS || shared->page_status[slotno] == SLRU_PAGE_WRITE_IN_PROGRESS) { - if (LWLockConditionalAcquire(shared->buffer_locks[slotno], LW_SHARED)) + if (LWLockConditionalAcquire(&shared->buffer_locks[slotno].lock, LW_SHARED)) { /* indeed, the I/O must have failed */ if (shared->page_status[slotno] == SLRU_PAGE_READ_IN_PROGRESS) @@ -333,7 +346,7 @@ SimpleLruWaitIO(SlruCtl ctl, int slotno) shared->page_status[slotno] = SLRU_PAGE_VALID; shared->page_dirty[slotno] = true; } - LWLockRelease(shared->buffer_locks[slotno]); + LWLockRelease(&shared->buffer_locks[slotno].lock); } } } @@ -402,7 +415,7 @@ SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok, shared->page_dirty[slotno] = false; /* Acquire per-buffer lock (cannot deadlock, see notes at top) */ - LWLockAcquire(shared->buffer_locks[slotno], LW_EXCLUSIVE); + LWLockAcquire(&shared->buffer_locks[slotno].lock, LW_EXCLUSIVE); /* Release control lock while doing I/O */ LWLockRelease(shared->ControlLock); @@ -422,7 +435,7 @@ SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok, shared->page_status[slotno] = ok ? SLRU_PAGE_VALID : SLRU_PAGE_EMPTY; - LWLockRelease(shared->buffer_locks[slotno]); + LWLockRelease(&shared->buffer_locks[slotno].lock); /* Now it's okay to ereport if we failed */ if (!ok) @@ -518,7 +531,7 @@ SlruInternalWritePage(SlruCtl ctl, int slotno, SlruFlush fdata) shared->page_dirty[slotno] = false; /* Acquire per-buffer lock (cannot deadlock, see notes at top) */ - LWLockAcquire(shared->buffer_locks[slotno], LW_EXCLUSIVE); + LWLockAcquire(&shared->buffer_locks[slotno].lock, LW_EXCLUSIVE); /* Release control lock while doing I/O */ LWLockRelease(shared->ControlLock); @@ -547,7 +560,7 @@ SlruInternalWritePage(SlruCtl ctl, int slotno, SlruFlush fdata) shared->page_status[slotno] = SLRU_PAGE_VALID; - LWLockRelease(shared->buffer_locks[slotno]); + LWLockRelease(&shared->buffer_locks[slotno].lock); /* Now it's okay to ereport if we failed */ if (!ok) |