> I believe it refers to the state of the lock prior to lock acquisition;
not prior to subtraction.

That definitely makes sense as a way to read this variable in context, but
after reviewing other usages of old_state in lwlock.c, I tend to think that
this is an outlier usage and maybe the naming was just copy-pasted from one
of the other compare-and-swaps, which tend to use "old state" to mean "the
state just before we mutated it.". Here are three other usages that make me
think this:

First, in LWLockWaitListLock, we have:

  old_state = pg_atomic_fetch_or_u32(&lock->state, LW_FLAG_LOCKED);

Here old_state contains the lock state *before* the compare and swap, the
opposite of the case we considered above, but it does also work out to "the
state prior to lock acquisition".

Next, in LWLockWaitListUnlock, we have:

       old_state = pg_atomic_fetch_and_u32(&lock->state, ~LW_FLAG_LOCKED);
       Assert(old_state & LW_FLAG_LOCKED);

... so in this case "old_state" means "the locked state just prior to the
unlock."

Third, In LWLockWaitListUnlock, we have:

      old_state = pg_atomic_read_u32(&lock->state);

which also refers to the locked state, prior to maybe being unlocked.

I want to say that in these 3 other examples, we are generally using
"old_state" to refer to "the state immediately prior to locally mutating
it," which can sometimes mean a locked and sometimes unlocked state. To me,
that's why the usage in LWLockRelease feels a little confusing, since it is
referring to "the state after we mutate it, but corresponding to an older
semantic state."

> But the name "newstate" wouldn't be great, either.
> I don't have a great name in mind, so perhaps a comment instead?

Hmm, maybe "unlocked_state" would be a better name in LWLockRelease, when
considered across these examples? Alternatively a comment like "Calculate
the "old" state, that is, prior to lock acquisition."

Regards,
Jacob

Reply via email to