Re: Assuming that TAS() will succeed the first time is verboten - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Assuming that TAS() will succeed the first time is verboten
Date
Msg-id 6185.978041215@sss.pgh.pa.us
Whole thread Raw
In response to RE: Assuming that TAS() will succeed the first time is verboten  ("Mikheev, Vadim" <vmikheev@SECTORBASE.COM>)
List pgsql-hackers
"Mikheev, Vadim" <vmikheev@SECTORBASE.COM> writes:
> Anyway I don't object if it bothers you -:)
> But please do not use S_LOCK - as you see WAL code try to do other
> things if slock of "primary interest" is busy.

In some places, yes.  But I also saw a number of places where S_LOCK is
sufficient, and I think it's clearer to code that way whenever there's
not useful work to do before acquiring the lock.  For example, is
   if (updrqst)   {       unsigned    i = 0;
       for (;;)       {           if (!TAS(&(XLogCtl->info_lck)))           {               if
(XLByteLT(XLogCtl->LgwrRqst.Write,LgwrRqst.Write))                   XLogCtl->LgwrRqst.Write = LgwrRqst.Write;
    S_UNLOCK(&(XLogCtl->info_lck));               break;           }           s_lock_sleep(i++);       }   }
 

really better than
   if (updrqst)   {       S_LOCK(&(XLogCtl->info_lck));       if (XLByteLT(XLogCtl->LgwrRqst.Write, LgwrRqst.Write))
      XLogCtl->LgwrRqst.Write = LgwrRqst.Write;       S_UNLOCK(&(XLogCtl->info_lck));   }
 

?  I don't think so...

What I'm thinking of doing for the places where there is useful work
to do while waiting is
spins = 0;while (TAS(lock)){    /* do useful work here */    S_LOCK_SLEEP(spins++);}

where S_LOCK_SLEEP() expands to do the same things as the body of the
existing loop in s_lock().
        regards, tom lane


pgsql-hackers by date:

Previous
From: "Mikheev, Vadim"
Date:
Subject: RE: Assuming that TAS() will succeed the first time is verboten
Next
From: "Mikheev, Vadim"
Date:
Subject: RE: Assuming that TAS() will succeed the first time is verboten