postgrespro.git / summary / log / commit / refs
commit 2f39106a209e647d7b1895331fca115f9bb6ec8d
Author: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat Sep 22 13:22:30 2018 +0000
Replace CAS loop with single TAS in ProcArrayGroupClearXid()
Single pg_atomic_exchange_u32() is expected to be faster than loop of
pg_atomic_compare_exchange_u32(). Also, it would be consistent with
clog group update code.
Discussion: https://postgr.es/m/CAPpHfdtxLsC-bqfxFcHswZ91OxXcZVNDBBVfg9tAWU0jvn1tQA%40mail.gmail.com
Reviewed-by: Amit Kapila
src/backend/storage/ipc/procarray.c | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index bd20497d81..bf2f4dbed2 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -542,14 +542,8 @@ ProcArrayGroupClearXid(PGPROC *proc, TransactionId latestXid)
* group XID clearing, saving a pointer to the head of the list. Trying
* to pop elements one at a time could lead to an ABA problem.
*/
- while (true)
- {
- nextidx = pg_atomic_read_u32(&procglobal->procArrayGroupFirst);
- if (pg_atomic_compare_exchange_u32(&procglobal->procArrayGroupFirst,
- &nextidx,
- INVALID_PGPROCNO))
- break;
- }
+ nextidx = pg_atomic_exchange_u32(&procglobal->procArrayGroupFirst,
+ INVALID_PGPROCNO);
/* Remember head of list so we can perform wakeups after dropping lock. */
wakeidx = nextidx;
[parent: db361db2fce7]