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]