Thread

Commits

  1. Use standard compare_exchange loop style in ProcArrayGroupClearXid().

  1. ProcArrayGroupClearXid() compare-exchange style

    Noah Misch <noah@leadboat.com> — 2019-10-15T03:53:48Z

    ProcArrayGroupClearXid() has this:
    
    	while (true)
    	{
    		nextidx = pg_atomic_read_u32(&procglobal->procArrayGroupFirst);
    
    		...
    
    		if (pg_atomic_compare_exchange_u32(&procglobal->procArrayGroupFirst,
    										   &nextidx,
    										   (uint32) proc->pgprocno))
    			break;
    	}
    
    This, from UnpinBuffer(), is our more-typical style:
    
    		old_buf_state = pg_atomic_read_u32(&buf->state);
    		for (;;)
    		{
    			...
    
    			if (pg_atomic_compare_exchange_u32(&buf->state, &old_buf_state,
    											   buf_state))
    				break;
    		}
    
    That is, we typically put the pg_atomic_read_u32() outside the loop.  After
    the first iteration, it is redundant with the side effect of
    pg_atomic_compare_exchange_u32().  I haven't checked whether this materially
    improves performance, but, for style, I would like to change it in HEAD.
    
  2. Re: ProcArrayGroupClearXid() compare-exchange style

    Amit Kapila <amit.kapila16@gmail.com> — 2019-10-15T09:30:01Z

    On Tue, Oct 15, 2019 at 9:23 AM Noah Misch <noah@leadboat.com> wrote:
    >
    > ProcArrayGroupClearXid() has this:
    >
    >         while (true)
    >         {
    >                 nextidx = pg_atomic_read_u32(&procglobal->procArrayGroupFirst);
    >
    >                 ...
    >
    >                 if (pg_atomic_compare_exchange_u32(&procglobal->procArrayGroupFirst,
    >                                                                                    &nextidx,
    >                                                                                    (uint32) proc->pgprocno))
    >                         break;
    >         }
    >
    > This, from UnpinBuffer(), is our more-typical style:
    >
    >                 old_buf_state = pg_atomic_read_u32(&buf->state);
    >                 for (;;)
    >                 {
    >                         ...
    >
    >                         if (pg_atomic_compare_exchange_u32(&buf->state, &old_buf_state,
    >                                                                                            buf_state))
    >                                 break;
    >                 }
    >
    > That is, we typically put the pg_atomic_read_u32() outside the loop.  After
    > the first iteration, it is redundant with the side effect of
    > pg_atomic_compare_exchange_u32().  I haven't checked whether this materially
    > improves performance, but, for style, I would like to change it in HEAD.
    >
    
    +1.  I am not sure if it would improve performance as this whole
    optimization was to reduce the number of attempts to acquire LWLock,
    but definitely, it makes the code consistent.
    
    -- 
    With Regards,
    Amit Kapila.
    EnterpriseDB: http://www.enterprisedb.com