From b36a53d3f2e9ab8c38dc20605056daa1382392fb Mon Sep 17 00:00:00 2001
From: Alexandre Felipe <o.alexandre.felipe@gmail.com>
Date: Fri, 2 Oct 2026 06:03:49 +0100
Subject: [PATCH 2/2] replace slock_{read,write}_*

---
 src/backend/access/transam/xlog.c             | 70 +++++--------------
 src/backend/access/transam/xlogrecovery.c     | 32 +++------
 src/backend/commands/repack.c                 | 12 +---
 src/backend/executor/nodeBitmapHeapscan.c     |  4 +-
 src/backend/postmaster/checkpointer.c         |  8 +--
 .../replication/logical/applyparallelworker.c | 12 +---
 src/backend/replication/logical/launcher.c    |  4 +-
 src/backend/replication/logical/slotsync.c    |  4 +-
 src/backend/replication/logical/worker.c      |  8 +--
 src/backend/replication/slot.c                |  8 +--
 src/backend/replication/syncrep.c             |  4 +-
 src/backend/replication/walreceiver.c         |  4 +-
 src/backend/replication/walreceiverfuncs.c    |  8 +--
 src/backend/replication/walsender.c           | 32 +++------
 src/backend/storage/buffer/freelist.c         |  4 +-
 src/backend/storage/ipc/barrier.c             |  4 +-
 src/backend/storage/ipc/shm_mq.c              | 12 +---
 src/backend/storage/ipc/sinvaladt.c           |  8 +--
 src/backend/storage/lmgr/lwlock.c             |  8 +--
 src/backend/utils/sort/tuplesort.c            |  4 +-
 20 files changed, 63 insertions(+), 187 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 9ec0be77ca0..5844892ec92 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -1620,9 +1620,7 @@ WaitXLogInsertionsToFinish(XLogRecPtr upto)
 		return inserted;
 
 	/* Read the current insert position */
-	SpinLockAcquire(&Insert->insertpos_lck);
-	bytepos = Insert->CurrBytePos;
-	SpinLockRelease(&Insert->insertpos_lck);
+	bytepos = slock_read_u64(&Insert->insertpos_lck, &Insert->CurrBytePos);
 	reservedUpto = XLogBytePosToEndRecPtr(bytepos);
 
 	/*
@@ -2748,9 +2746,7 @@ XLogSetAsyncXactLSN(XLogRecPtr asyncXactLSN)
 void
 XLogSetReplicationSlotMinimumLSN(XLogRecPtr lsn)
 {
-	SpinLockAcquire(&XLogCtl->info_lck);
-	XLogCtl->replicationSlotMinLSN = lsn;
-	SpinLockRelease(&XLogCtl->info_lck);
+	slock_write_u64(&XLogCtl->info_lck, &XLogCtl->replicationSlotMinLSN, lsn);
 }
 
 
@@ -2763,9 +2759,7 @@ XLogGetReplicationSlotMinimumLSN(void)
 {
 	XLogRecPtr	retval;
 
-	SpinLockAcquire(&XLogCtl->info_lck);
-	retval = XLogCtl->replicationSlotMinLSN;
-	SpinLockRelease(&XLogCtl->info_lck);
+	retval = slock_read_u64(&XLogCtl->info_lck, &XLogCtl->replicationSlotMinLSN);
 
 	return retval;
 }
@@ -3081,7 +3075,7 @@ XLogBackgroundFlush(void)
 	 */
 	insertTLI = XLogCtl->InsertTimeLineID;
 
-	/* read updated LogwrtRqst */
+	/* read updated LogwrtRqst struct */
 	SpinLockAcquire(&XLogCtl->info_lck);
 	WriteRqst = XLogCtl->LogwrtRqst;
 	SpinLockRelease(&XLogCtl->info_lck);
@@ -3841,9 +3835,7 @@ CheckXLogRemoved(XLogSegNo segno, TimeLineID tli)
 	int			save_errno = errno;
 	XLogSegNo	lastRemovedSegNo;
 
-	SpinLockAcquire(&XLogCtl->info_lck);
-	lastRemovedSegNo = XLogCtl->lastRemovedSegNo;
-	SpinLockRelease(&XLogCtl->info_lck);
+	lastRemovedSegNo = slock_read_u64(&XLogCtl->info_lck, &XLogCtl->lastRemovedSegNo);
 
 	if (segno <= lastRemovedSegNo)
 	{
@@ -3871,9 +3863,7 @@ XLogGetLastRemovedSegno(void)
 {
 	XLogSegNo	lastRemovedSegNo;
 
-	SpinLockAcquire(&XLogCtl->info_lck);
-	lastRemovedSegNo = XLogCtl->lastRemovedSegNo;
-	SpinLockRelease(&XLogCtl->info_lck);
+	lastRemovedSegNo = slock_read_u64(&XLogCtl->info_lck, &XLogCtl->lastRemovedSegNo);
 
 	return lastRemovedSegNo;
 }
@@ -5109,9 +5099,7 @@ CheckReplayedDataChecksumState(uint32 replayed_state)
 	if (!reachedConsistency)
 		return;
 
-	SpinLockAcquire(&XLogCtl->info_lck);
-	local_state = XLogCtl->data_checksum_version;
-	SpinLockRelease(&XLogCtl->info_lck);
+	local_state = slock_read_u32(&XLogCtl->info_lck, &XLogCtl->data_checksum_version);
 
 	if (replayed_state == local_state)
 	{
@@ -6994,9 +6982,7 @@ SwitchIntoArchiveRecovery(XLogRecPtr EndRecPtr, TimeLineID replayTLI)
 	 * We update SharedRecoveryState while holding the lock on ControlFileLock
 	 * so both states are consistent in shared memory.
 	 */
-	SpinLockAcquire(&XLogCtl->info_lck);
-	XLogCtl->SharedRecoveryState = RECOVERY_STATE_ARCHIVE;
-	SpinLockRelease(&XLogCtl->info_lck);
+	slock_write_u32(&XLogCtl->info_lck, &XLogCtl->SharedRecoveryState, RECOVERY_STATE_ARCHIVE);
 
 	LWLockRelease(ControlFileLock);
 }
@@ -7057,9 +7043,7 @@ PerformRecoveryXLogAction(void)
 	 * transition are still only in the buffer pool, so take the full
 	 * checkpoint below instead of the lightweight record.
 	 */
-	SpinLockAcquire(&XLogCtl->info_lck);
-	checksum_state = XLogCtl->data_checksum_version;
-	SpinLockRelease(&XLogCtl->info_lck);
+	checksum_state = slock_read_u32(&XLogCtl->info_lck, &XLogCtl->data_checksum_version);
 
 	flushForChecksums = (checksum_state == PG_DATA_CHECKSUM_VERSION &&
 						 ControlFile->data_checksum_version != checksum_state);
@@ -7150,9 +7134,7 @@ GetRecoveryState(void)
 {
 	RecoveryState retval;
 
-	SpinLockAcquire(&XLogCtl->info_lck);
-	retval = XLogCtl->SharedRecoveryState;
-	SpinLockRelease(&XLogCtl->info_lck);
+	retval = slock_read_u32(&XLogCtl->info_lck, &XLogCtl->SharedRecoveryState);
 
 	return retval;
 }
@@ -7223,9 +7205,7 @@ GetRedoRecPtr(void)
 	 * Insert->RedoRecPtr, someone might update it just after we've released
 	 * the lock.
 	 */
-	SpinLockAcquire(&XLogCtl->info_lck);
-	ptr = XLogCtl->RedoRecPtr;
-	SpinLockRelease(&XLogCtl->info_lck);
+	ptr = slock_read_u64(&XLogCtl->info_lck, &XLogCtl->RedoRecPtr);
 
 	if (RedoRecPtr < ptr)
 		RedoRecPtr = ptr;
@@ -7316,9 +7296,7 @@ GetWALInsertionTimeLineIfSet(void)
 {
 	TimeLineID	insertTLI;
 
-	SpinLockAcquire(&XLogCtl->info_lck);
-	insertTLI = XLogCtl->InsertTimeLineID;
-	SpinLockRelease(&XLogCtl->info_lck);
+	insertTLI = slock_read_u32(&XLogCtl->info_lck, &XLogCtl->InsertTimeLineID);
 
 	return insertTLI;
 }
@@ -9697,9 +9675,7 @@ xlog2_redo(XLogReaderState *record)
 
 		memcpy(&state, XLogRecGetData(record), sizeof(xl_checksum_state));
 
-		SpinLockAcquire(&XLogCtl->info_lck);
-		watermark = XLogCtl->data_checksum_lsn;
-		SpinLockRelease(&XLogCtl->info_lck);
+		watermark = slock_read_u64(&XLogCtl->info_lck, &XLogCtl->data_checksum_lsn);
 
 		/*
 		 * Skip records this node has already applied.  The control file
@@ -10100,9 +10076,7 @@ do_pg_backup_start(const char *backupidstr, bool fast, List **tablespaces,
 				 * (i.e., since last restartpoint used as backup starting
 				 * checkpoint) contain full-page writes.
 				 */
-				SpinLockAcquire(&XLogCtl->info_lck);
-				recptr = XLogCtl->lastFpwDisableRecPtr;
-				SpinLockRelease(&XLogCtl->info_lck);
+				recptr = slock_read_u64(&XLogCtl->info_lck, &XLogCtl->lastFpwDisableRecPtr);
 
 				if (!checkpointfpw || state->startpoint <= recptr)
 					ereport(ERROR,
@@ -10396,9 +10370,7 @@ do_pg_backup_stop(BackupState *state, bool waitforarchive)
 		 * Check to see if all WAL replayed during online backup contain
 		 * full-page writes.
 		 */
-		SpinLockAcquire(&XLogCtl->info_lck);
-		recptr = XLogCtl->lastFpwDisableRecPtr;
-		SpinLockRelease(&XLogCtl->info_lck);
+		recptr = slock_read_u64(&XLogCtl->info_lck, &XLogCtl->lastFpwDisableRecPtr);
 
 		if (state->startpoint <= recptr)
 			ereport(ERROR,
@@ -10613,9 +10585,7 @@ GetXLogInsertRecPtr(void)
 	XLogCtlInsert *Insert = &XLogCtl->Insert;
 	uint64		current_bytepos;
 
-	SpinLockAcquire(&Insert->insertpos_lck);
-	current_bytepos = Insert->CurrBytePos;
-	SpinLockRelease(&Insert->insertpos_lck);
+	current_bytepos = slock_read_u64(&Insert->insertpos_lck, &Insert->CurrBytePos);
 
 	return XLogBytePosToRecPtr(current_bytepos);
 }
@@ -10629,9 +10599,7 @@ GetXLogInsertEndRecPtr(void)
 	XLogCtlInsert *Insert = &XLogCtl->Insert;
 	uint64		current_bytepos;
 
-	SpinLockAcquire(&Insert->insertpos_lck);
-	current_bytepos = Insert->CurrBytePos;
-	SpinLockRelease(&Insert->insertpos_lck);
+	current_bytepos = slock_read_u64(&Insert->insertpos_lck, &Insert->CurrBytePos);
 
 	return XLogBytePosToEndRecPtr(current_bytepos);
 }
@@ -10706,7 +10674,5 @@ IsInstallXLogFileSegmentActive(void)
 void
 SetWalWriterSleeping(bool sleeping)
 {
-	SpinLockAcquire(&XLogCtl->info_lck);
-	XLogCtl->WalWriterSleeping = sleeping;
-	SpinLockRelease(&XLogCtl->info_lck);
+	slock_write_u8(&XLogCtl->info_lck, &XLogCtl->WalWriterSleeping, sleeping);
 }
diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c
index fff8d57ac61..51720f990d5 100644
--- a/src/backend/access/transam/xlogrecovery.c
+++ b/src/backend/access/transam/xlogrecovery.c
@@ -3062,9 +3062,7 @@ GetRecoveryPauseState(void)
 {
 	RecoveryPauseState state;
 
-	SpinLockAcquire(&XLogRecoveryCtl->info_lck);
-	state = XLogRecoveryCtl->recoveryPauseState;
-	SpinLockRelease(&XLogRecoveryCtl->info_lck);
+	state = slock_read_u32(&XLogRecoveryCtl->info_lck, &XLogRecoveryCtl->recoveryPauseState);
 
 	return state;
 }
@@ -4426,9 +4424,7 @@ PromoteIsTriggered(void)
 	if (LocalPromoteIsTriggered)
 		return true;
 
-	SpinLockAcquire(&XLogRecoveryCtl->info_lck);
-	LocalPromoteIsTriggered = XLogRecoveryCtl->SharedPromoteIsTriggered;
-	SpinLockRelease(&XLogRecoveryCtl->info_lck);
+	LocalPromoteIsTriggered = slock_read_u8(&XLogRecoveryCtl->info_lck, &XLogRecoveryCtl->SharedPromoteIsTriggered);
 
 	return LocalPromoteIsTriggered;
 }
@@ -4503,9 +4499,7 @@ RecoverySubtransInitialized(void)
 {
 	bool		result;
 
-	SpinLockAcquire(&XLogRecoveryCtl->info_lck);
-	result = XLogRecoveryCtl->SharedRecoverySubtransInitialized;
-	SpinLockRelease(&XLogRecoveryCtl->info_lck);
+	result = slock_read_u8(&XLogRecoveryCtl->info_lck, &XLogRecoveryCtl->SharedRecoverySubtransInitialized);
 
 	return result;
 }
@@ -4562,9 +4556,7 @@ HotStandbyActive(void)
 	else
 	{
 		/* spinlock is essential on machines with weak memory ordering! */
-		SpinLockAcquire(&XLogRecoveryCtl->info_lck);
-		LocalHotStandbyActive = XLogRecoveryCtl->SharedHotStandbyActive;
-		SpinLockRelease(&XLogRecoveryCtl->info_lck);
+		LocalHotStandbyActive = slock_read_u8(&XLogRecoveryCtl->info_lck, &XLogRecoveryCtl->SharedHotStandbyActive);
 
 		return LocalHotStandbyActive;
 	}
@@ -4635,9 +4627,7 @@ GetCurrentReplayRecPtr(TimeLineID *replayEndTLI)
 static void
 SetLatestXTime(TimestampTz xtime)
 {
-	SpinLockAcquire(&XLogRecoveryCtl->info_lck);
-	XLogRecoveryCtl->recoveryLastXTime = xtime;
-	SpinLockRelease(&XLogRecoveryCtl->info_lck);
+	slock_write_u64(&XLogRecoveryCtl->info_lck, &XLogRecoveryCtl->recoveryLastXTime, xtime);
 }
 
 /*
@@ -4648,9 +4638,7 @@ GetLatestXTime(void)
 {
 	TimestampTz xtime;
 
-	SpinLockAcquire(&XLogRecoveryCtl->info_lck);
-	xtime = XLogRecoveryCtl->recoveryLastXTime;
-	SpinLockRelease(&XLogRecoveryCtl->info_lck);
+	xtime = slock_read_u64(&XLogRecoveryCtl->info_lck, &XLogRecoveryCtl->recoveryLastXTime);
 
 	return xtime;
 }
@@ -4664,9 +4652,7 @@ GetLatestXTime(void)
 static void
 SetCurrentChunkStartTime(TimestampTz xtime)
 {
-	SpinLockAcquire(&XLogRecoveryCtl->info_lck);
-	XLogRecoveryCtl->currentChunkStartTime = xtime;
-	SpinLockRelease(&XLogRecoveryCtl->info_lck);
+	slock_write_u64(&XLogRecoveryCtl->info_lck, &XLogRecoveryCtl->currentChunkStartTime, xtime);
 }
 
 /*
@@ -4678,9 +4664,7 @@ GetCurrentChunkReplayStartTime(void)
 {
 	TimestampTz xtime;
 
-	SpinLockAcquire(&XLogRecoveryCtl->info_lck);
-	xtime = XLogRecoveryCtl->currentChunkStartTime;
-	SpinLockRelease(&XLogRecoveryCtl->info_lck);
+	xtime = slock_read_u64(&XLogRecoveryCtl->info_lck, &XLogRecoveryCtl->currentChunkStartTime);
 
 	return xtime;
 }
diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c
index 759be53d6b8..03832f4af53 100644
--- a/src/backend/commands/repack.c
+++ b/src/backend/commands/repack.c
@@ -3125,9 +3125,7 @@ process_concurrent_changes(XLogRecPtr end_of_wal, ChangeContext *chgcxt, bool do
 	{
 		int			last_exported;
 
-		SpinLockAcquire(&shared->mutex);
-		last_exported = shared->last_exported;
-		SpinLockRelease(&shared->mutex);
+		last_exported = slock_read_u32(&shared->mutex, &shared->last_exported);
 
 		/*
 		 * Has the worker exported the file we are waiting for?
@@ -3826,9 +3824,7 @@ start_repack_decoding_worker(Oid relid)
 	{
 		bool		initialized;
 
-		SpinLockAcquire(&shared->mutex);
-		initialized = shared->initialized;
-		SpinLockRelease(&shared->mutex);
+		initialized = slock_read_u8(&shared->mutex, &shared->initialized);
 
 		if (initialized)
 			break;
@@ -4007,9 +4003,7 @@ get_initial_snapshot(DecodingWorker *worker)
 	{
 		int			last_exported;
 
-		SpinLockAcquire(&shared->mutex);
-		last_exported = shared->last_exported;
-		SpinLockRelease(&shared->mutex);
+		last_exported = slock_read_u32(&shared->mutex, &shared->last_exported);
 
 		/*
 		 * Has the worker exported the file we are waiting for?
diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c
index 83d6478bc2b..21162ba2e4f 100644
--- a/src/backend/executor/nodeBitmapHeapscan.c
+++ b/src/backend/executor/nodeBitmapHeapscan.c
@@ -228,9 +228,7 @@ BitmapHeapNext(BitmapHeapScanState *node)
 static inline void
 BitmapDoneInitializingSharedState(ParallelBitmapHeapState *pstate)
 {
-	SpinLockAcquire(&pstate->mutex);
-	pstate->state = BM_FINISHED;
-	SpinLockRelease(&pstate->mutex);
+	slock_write_u32(&pstate->mutex, &pstate->state, BM_FINISHED);
 	ConditionVariableBroadcast(&pstate->cv);
 }
 
diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c
index 580c7944119..66dff109c0c 100644
--- a/src/backend/postmaster/checkpointer.c
+++ b/src/backend/postmaster/checkpointer.c
@@ -1149,9 +1149,7 @@ RequestCheckpoint(int flags)
 		ConditionVariablePrepareToSleep(&CheckpointerShmem->start_cv);
 		for (;;)
 		{
-			SpinLockAcquire(&CheckpointerShmem->ckpt_lck);
-			new_started = CheckpointerShmem->ckpt_started;
-			SpinLockRelease(&CheckpointerShmem->ckpt_lck);
+			new_started = slock_read_u32(&CheckpointerShmem->ckpt_lck, &CheckpointerShmem->ckpt_started);
 
 			if (new_started != old_started)
 				break;
@@ -1517,9 +1515,7 @@ FirstCallSinceLastCheckpoint(void)
 	int			new_done;
 	bool		FirstCall = false;
 
-	SpinLockAcquire(&CheckpointerShmem->ckpt_lck);
-	new_done = CheckpointerShmem->ckpt_done;
-	SpinLockRelease(&CheckpointerShmem->ckpt_lck);
+	new_done = slock_read_u32(&CheckpointerShmem->ckpt_lck, &CheckpointerShmem->ckpt_done);
 
 	if (new_done != ckpt_done)
 		FirstCall = true;
diff --git a/src/backend/replication/logical/applyparallelworker.c b/src/backend/replication/logical/applyparallelworker.c
index 96bf499e49c..de5b2d0a309 100644
--- a/src/backend/replication/logical/applyparallelworker.c
+++ b/src/backend/replication/logical/applyparallelworker.c
@@ -1327,9 +1327,7 @@ void
 pa_set_xact_state(ParallelApplyWorkerShared *wshared,
 				  ParallelTransState xact_state)
 {
-	SpinLockAcquire(&wshared->mutex);
-	wshared->xact_state = xact_state;
-	SpinLockRelease(&wshared->mutex);
+	slock_write_u32(&wshared->mutex, &wshared->xact_state, xact_state);
 }
 
 /*
@@ -1340,9 +1338,7 @@ pa_get_xact_state(ParallelApplyWorkerShared *wshared)
 {
 	ParallelTransState xact_state;
 
-	SpinLockAcquire(&wshared->mutex);
-	xact_state = wshared->xact_state;
-	SpinLockRelease(&wshared->mutex);
+	xact_state = slock_read_u32(&wshared->mutex, &wshared->xact_state);
 
 	return xact_state;
 }
@@ -1541,9 +1537,7 @@ pa_get_fileset_state(void)
 
 	Assert(am_parallel_apply_worker());
 
-	SpinLockAcquire(&MyParallelShared->mutex);
-	fileset_state = MyParallelShared->fileset_state;
-	SpinLockRelease(&MyParallelShared->mutex);
+	fileset_state = slock_read_u32(&MyParallelShared->mutex, &MyParallelShared->fileset_state);
 
 	return fileset_state;
 }
diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c
index 5057a928adb..41d58fad4fb 100644
--- a/src/backend/replication/logical/launcher.c
+++ b/src/backend/replication/logical/launcher.c
@@ -1490,9 +1490,7 @@ collect_min_nonremovable_xid(Subscription *sub, LogicalRepWorker *worker,
 
 	if (worker)
 	{
-		SpinLockAcquire(&worker->relmutex);
-		nonremovable_xid = worker->oldest_nonremovable_xid;
-		SpinLockRelease(&worker->relmutex);
+		nonremovable_xid = slock_read_u32(&worker->relmutex, &worker->oldest_nonremovable_xid);
 	}
 
 	/*
diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index c0403893e23..b26db97c3ca 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -205,9 +205,7 @@ update_slotsync_skip_stats(SlotSyncSkipReason skip_reason)
 	/* Update the slot sync skip reason */
 	if (slot->slotsync_skip_reason != skip_reason)
 	{
-		SpinLockAcquire(&slot->mutex);
-		slot->slotsync_skip_reason = skip_reason;
-		SpinLockRelease(&slot->mutex);
+		slock_write_u32(&slot->mutex, &slot->slotsync_skip_reason, skip_reason);
 	}
 }
 
diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c
index 7781bb1c168..58e805243d0 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -3366,9 +3366,7 @@ FindDeletedTupleInLocalRel(Relation localrel, Oid localidxoid,
 					 errmsg("could not detect conflict as the leader apply worker has exited")));
 		}
 
-		SpinLockAcquire(&leader->relmutex);
-		oldestxmin = leader->oldest_nonremovable_xid;
-		SpinLockRelease(&leader->relmutex);
+		oldestxmin = slock_read_u32(&leader->relmutex, &leader->oldest_nonremovable_xid);
 		LWLockRelease(LogicalRepWorkerLock);
 	}
 
@@ -4862,9 +4860,7 @@ stop_conflict_info_retention(RetainDeadTuplesData *rdt_data)
 		if (!update_retention_status(false))
 			return;
 
-		SpinLockAcquire(&MyLogicalRepWorker->relmutex);
-		MyLogicalRepWorker->oldest_nonremovable_xid = InvalidTransactionId;
-		SpinLockRelease(&MyLogicalRepWorker->relmutex);
+		slock_write_u32(&MyLogicalRepWorker->relmutex, &MyLogicalRepWorker->oldest_nonremovable_xid, InvalidTransactionId);
 
 		ereport(LOG,
 				errmsg("logical replication worker for subscription \"%s\" has stopped retaining the information for detecting conflicts",
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 63ce6d27885..fe16c7f843c 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -801,9 +801,7 @@ ReplicationSlotRelease(void)
 		if (!TransactionIdIsValid(slot->data.xmin) &&
 			TransactionIdIsValid(slot->effective_xmin))
 		{
-			SpinLockAcquire(&slot->mutex);
-			slot->effective_xmin = InvalidTransactionId;
-			SpinLockRelease(&slot->mutex);
+			slock_write_u32(&slot->mutex, &slot->effective_xmin, InvalidTransactionId);
 			ReplicationSlotsComputeRequiredXmin(false);
 		}
 
@@ -1096,9 +1094,7 @@ ReplicationSlotDropPtr(ReplicationSlot *slot)
 	{
 		bool		fail_softly = slot->data.persistency != RS_PERSISTENT;
 
-		SpinLockAcquire(&slot->mutex);
-		slot->active_proc = INVALID_PROC_NUMBER;
-		SpinLockRelease(&slot->mutex);
+		slock_write_u32(&slot->mutex, &slot->active_proc, INVALID_PROC_NUMBER);
 
 		/* wake up anyone waiting on this slot */
 		ConditionVariableBroadcast(&slot->active_cv);
diff --git a/src/backend/replication/syncrep.c b/src/backend/replication/syncrep.c
index d870f09e0a0..233acbff0a3 100644
--- a/src/backend/replication/syncrep.c
+++ b/src/backend/replication/syncrep.c
@@ -463,9 +463,7 @@ SyncRepInitConfig(void)
 	priority = SyncRepGetStandbyPriority();
 	if (MyWalSnd->sync_standby_priority != priority)
 	{
-		SpinLockAcquire(&MyWalSnd->mutex);
-		MyWalSnd->sync_standby_priority = priority;
-		SpinLockRelease(&MyWalSnd->mutex);
+		slock_write_u32(&MyWalSnd->mutex, &MyWalSnd->sync_standby_priority, priority);
 
 		ereport(DEBUG1,
 				(errmsg_internal("standby \"%s\" now has synchronous standby priority %d",
diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index b93e699ba4b..7f3c1d01752 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -1481,9 +1481,7 @@ WalRcvRequestApplyReply(void)
 
 	WalRcv->apply_reply_requested = true;
 	/* fetching the proc number is probably atomic, but don't rely on it */
-	SpinLockAcquire(&WalRcv->mutex);
-	procno = WalRcv->procno;
-	SpinLockRelease(&WalRcv->mutex);
+	procno = slock_read_u32(&WalRcv->mutex, &WalRcv->procno);
 	if (procno != INVALID_PROC_NUMBER)
 		SetLatch(&GetPGProcByNumber(procno)->procLatch);
 }
diff --git a/src/backend/replication/walreceiverfuncs.c b/src/backend/replication/walreceiverfuncs.c
index ecf510517eb..985ab4f672e 100644
--- a/src/backend/replication/walreceiverfuncs.c
+++ b/src/backend/replication/walreceiverfuncs.c
@@ -126,9 +126,7 @@ WalRcvGetState(void)
 	WalRcvData *walrcv = WalRcv;
 	WalRcvState state;
 
-	SpinLockAcquire(&walrcv->mutex);
-	state = walrcv->walRcvState;
-	SpinLockRelease(&walrcv->mutex);
+	state = slock_read_u32(&walrcv->mutex, &walrcv->walRcvState);
 
 	return state;
 }
@@ -397,9 +395,7 @@ GetReplicationApplyDelay(void)
 	XLogRecPtr	replayPtr;
 	TimestampTz chunkReplayStartTime;
 
-	SpinLockAcquire(&walrcv->mutex);
-	receivePtr = walrcv->flushedUpto;
-	SpinLockRelease(&walrcv->mutex);
+	receivePtr = slock_read_u64(&walrcv->mutex, &walrcv->flushedUpto);
 
 	replayPtr = GetXLogReplayRecPtr(NULL);
 
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index e9331de3df5..bcc7dff0597 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -1013,9 +1013,7 @@ StartReplication(StartReplicationCmd *cmd)
 		sentPtr = cmd->startpoint;
 
 		/* Initialize shared memory status, too */
-		SpinLockAcquire(&MyWalSnd->mutex);
-		MyWalSnd->sentPtr = sentPtr;
-		SpinLockRelease(&MyWalSnd->mutex);
+		slock_write_u64(&MyWalSnd->mutex, &MyWalSnd->sentPtr, sentPtr);
 
 		SyncRepInitConfig();
 
@@ -2773,9 +2771,7 @@ ProcessStandbyHSFeedbackMessage(void)
 	{
 		WalSnd	   *walsnd = MyWalSnd;
 
-		SpinLockAcquire(&walsnd->mutex);
-		walsnd->replyTime = replyTime;
-		SpinLockRelease(&walsnd->mutex);
+		slock_write_u64(&walsnd->mutex, &walsnd->replyTime, replyTime);
 	}
 
 	/*
@@ -2873,9 +2869,7 @@ ProcessStandbyPSRequestMessage(void)
 	 * Update shared state for this WalSender process based on reply data from
 	 * standby.
 	 */
-	SpinLockAcquire(&walsnd->mutex);
-	walsnd->replyTime = replyTime;
-	SpinLockRelease(&walsnd->mutex);
+	slock_write_u64(&walsnd->mutex, &walsnd->replyTime, replyTime);
 
 	/*
 	 * Consider transactions in the current database, as only these are the
@@ -3296,9 +3290,7 @@ WalSndKill(int code, Datum arg)
 
 	MyWalSnd = NULL;
 
-	SpinLockAcquire(&walsnd->mutex);
-	/* Mark WalSnd struct as no longer being in use. */
-	walsnd->pid = 0;
+	slock_write_u32(&walsnd->mutex, &walsnd->pid, 0);
 	SpinLockRelease(&walsnd->mutex);
 }
 
@@ -3672,9 +3664,7 @@ retry:
 	{
 		WalSnd	   *walsnd = MyWalSnd;
 
-		SpinLockAcquire(&walsnd->mutex);
-		walsnd->sentPtr = sentPtr;
-		SpinLockRelease(&walsnd->mutex);
+		slock_write_u64(&walsnd->mutex, &walsnd->sentPtr, sentPtr);
 	}
 
 	/* Report progress of XLOG streaming in PS display */
@@ -3769,9 +3759,7 @@ XLogSendLogical(void)
 	{
 		WalSnd	   *walsnd = MyWalSnd;
 
-		SpinLockAcquire(&walsnd->mutex);
-		walsnd->sentPtr = sentPtr;
-		SpinLockRelease(&walsnd->mutex);
+		slock_write_u64(&walsnd->mutex, &walsnd->sentPtr, sentPtr);
 	}
 }
 
@@ -4160,9 +4148,7 @@ WalSndInitStopping(void)
 		WalSnd	   *walsnd = &WalSndCtl->walsnds[i];
 		pid_t		pid;
 
-		SpinLockAcquire(&walsnd->mutex);
-		pid = walsnd->pid;
-		SpinLockRelease(&walsnd->mutex);
+		pid = slock_read_u32(&walsnd->mutex, &walsnd->pid);
 
 		if (pid == 0)
 			continue;
@@ -4224,9 +4210,7 @@ WalSndSetState(WalSndState state)
 	if (walsnd->state == state)
 		return;
 
-	SpinLockAcquire(&walsnd->mutex);
-	walsnd->state = state;
-	SpinLockRelease(&walsnd->mutex);
+	slock_write_u32(&walsnd->mutex, &walsnd->state, state);
 }
 
 /*
diff --git a/src/backend/storage/buffer/freelist.c b/src/backend/storage/buffer/freelist.c
index fdb5bad7910..c936182901a 100644
--- a/src/backend/storage/buffer/freelist.c
+++ b/src/backend/storage/buffer/freelist.c
@@ -372,9 +372,7 @@ StrategyNotifyBgWriter(int bgwprocno)
 	 * atomic to StrategyGetBuffer.  The bgwriter should call this rather
 	 * infrequently, so there's no performance penalty from being safe.
 	 */
-	SpinLockAcquire(&StrategyControl->buffer_strategy_lock);
-	StrategyControl->bgwprocno = bgwprocno;
-	SpinLockRelease(&StrategyControl->buffer_strategy_lock);
+	slock_write_u32(&StrategyControl->buffer_strategy_lock, &StrategyControl->bgwprocno, bgwprocno);
 }
 
 
diff --git a/src/backend/storage/ipc/barrier.c b/src/backend/storage/ipc/barrier.c
index 3fba281a75c..c9ecd19112c 100644
--- a/src/backend/storage/ipc/barrier.c
+++ b/src/backend/storage/ipc/barrier.c
@@ -282,9 +282,7 @@ BarrierParticipants(Barrier *barrier)
 {
 	int			participants;
 
-	SpinLockAcquire(&barrier->mutex);
-	participants = barrier->participants;
-	SpinLockRelease(&barrier->mutex);
+	participants = slock_read_u32(&barrier->mutex, &barrier->participants);
 
 	return participants;
 }
diff --git a/src/backend/storage/ipc/shm_mq.c b/src/backend/storage/ipc/shm_mq.c
index 26b24158ed9..b30bff88612 100644
--- a/src/backend/storage/ipc/shm_mq.c
+++ b/src/backend/storage/ipc/shm_mq.c
@@ -245,9 +245,7 @@ shm_mq_get_receiver(shm_mq *mq)
 {
 	PGPROC	   *receiver;
 
-	SpinLockAcquire(&mq->mq_mutex);
-	receiver = mq->mq_receiver;
-	SpinLockRelease(&mq->mq_mutex);
+	receiver = slock_read_ptr(&mq->mq_mutex, &mq->mq_receiver);
 
 	return receiver;
 }
@@ -260,9 +258,7 @@ shm_mq_get_sender(shm_mq *mq)
 {
 	PGPROC	   *sender;
 
-	SpinLockAcquire(&mq->mq_mutex);
-	sender = mq->mq_sender;
-	SpinLockRelease(&mq->mq_mutex);
+	sender = slock_read_ptr(&mq->mq_mutex, &mq->mq_sender);
 
 	return sender;
 }
@@ -525,9 +521,7 @@ shm_mq_sendv(shm_mq_handle *mqh, shm_mq_iovec *iov, int iovcnt, bool nowait,
 		receiver = mq->mq_receiver;
 	else
 	{
-		SpinLockAcquire(&mq->mq_mutex);
-		receiver = mq->mq_receiver;
-		SpinLockRelease(&mq->mq_mutex);
+		receiver = slock_read_ptr(&mq->mq_mutex, &mq->mq_receiver);
 		if (receiver != NULL)
 			mqh->mqh_counterparty_attached = true;
 	}
diff --git a/src/backend/storage/ipc/sinvaladt.c b/src/backend/storage/ipc/sinvaladt.c
index 37a21ffaf1a..572242e8d24 100644
--- a/src/backend/storage/ipc/sinvaladt.c
+++ b/src/backend/storage/ipc/sinvaladt.c
@@ -421,9 +421,7 @@ SIInsertDataEntries(const SharedInvalidationMessage *data, int n)
 		}
 
 		/* Update current value of maxMsgNum using spinlock */
-		SpinLockAcquire(&segP->msgnumLock);
-		segP->maxMsgNum = max;
-		SpinLockRelease(&segP->msgnumLock);
+		slock_write_u32(&segP->msgnumLock, &segP->maxMsgNum, max);
 
 		/*
 		 * Now that the maxMsgNum change is globally visible, we give everyone
@@ -510,9 +508,7 @@ SIGetDataEntries(SharedInvalidationMessage *data, int datasize)
 	stateP->hasMessages = false;
 
 	/* Fetch current value of maxMsgNum using spinlock */
-	SpinLockAcquire(&segP->msgnumLock);
-	max = segP->maxMsgNum;
-	SpinLockRelease(&segP->msgnumLock);
+	max = slock_read_u32(&segP->msgnumLock, &segP->maxMsgNum);
 
 	if (stateP->resetState)
 	{
diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c
index 82a1d4d2e26..ebc49e0690d 100644
--- a/src/backend/storage/lmgr/lwlock.c
+++ b/src/backend/storage/lmgr/lwlock.c
@@ -521,9 +521,7 @@ InitLWLockAccess(void)
 LWLockPadded *
 GetNamedLWLockTranche(const char *tranche_name)
 {
-	SpinLockAcquire(&LWLockTranches->lock);
-	LocalNumUserDefinedTranches = LWLockTranches->num_user_defined;
-	SpinLockRelease(&LWLockTranches->lock);
+	LocalNumUserDefinedTranches = slock_read_u32(&LWLockTranches->lock, &LWLockTranches->num_user_defined);
 
 	/*
 	 * Obtain the position of base address of LWLock belonging to requested
@@ -729,9 +727,7 @@ GetLWTrancheName(uint16 trancheId)
 	 */
 	if (idx >= LocalNumUserDefinedTranches)
 	{
-		SpinLockAcquire(&LWLockTranches->lock);
-		LocalNumUserDefinedTranches = LWLockTranches->num_user_defined;
-		SpinLockRelease(&LWLockTranches->lock);
+		LocalNumUserDefinedTranches = slock_read_u32(&LWLockTranches->lock, &LWLockTranches->num_user_defined);
 
 		if (idx >= LocalNumUserDefinedTranches)
 			elog(ERROR, "tranche %d is not registered", trancheId);
diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c
index f67651483f8..1015d2854ca 100644
--- a/src/backend/utils/sort/tuplesort.c
+++ b/src/backend/utils/sort/tuplesort.c
@@ -3389,9 +3389,7 @@ leader_takeover_tapes(Tuplesortstate *state)
 	Assert(LEADER(state));
 	Assert(nParticipants >= 1);
 
-	SpinLockAcquire(&shared->mutex);
-	workersFinished = shared->workersFinished;
-	SpinLockRelease(&shared->mutex);
+	workersFinished = slock_read_u32(&shared->mutex, &shared->workersFinished);
 
 	if (nParticipants != workersFinished)
 		elog(ERROR, "cannot take over tapes before all workers finish");
-- 
2.53.0

