Remove STATUS_WAITING
authorPeter Eisentraut <peter@eisentraut.org>
Wed, 17 Jun 2020 07:14:37 +0000 (09:14 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Wed, 17 Jun 2020 07:14:37 +0000 (09:14 +0200)
Add a separate enum for use in the locking APIs, which were the only
user.

Discussion: https://www.postgresql.org/message-id/flat/a6f91ead-0ce4-2a34-062b-7ab9813ea308%402ndquadrant.com

src/backend/access/transam/twophase.c
src/backend/storage/lmgr/lock.c
src/backend/storage/lmgr/proc.c
src/include/c.h
src/include/storage/proc.h

index e1904877faa5514de427568ae28d2b57544ad174..54fb6cc047454dd5374c118488a6925b1f892640 100644 (file)
@@ -460,7 +460,7 @@ MarkAsPreparingGuts(GlobalTransaction gxact, TransactionId xid, const char *gid,
        MemSet(proc, 0, sizeof(PGPROC));
        proc->pgprocno = gxact->pgprocno;
        SHMQueueElemInit(&(proc->links));
-       proc->waitStatus = STATUS_OK;
+       proc->waitStatus = PROC_WAIT_STATUS_OK;
        /* We set up the gxact's VXID as InvalidBackendId/XID */
        proc->lxid = (LocalTransactionId) xid;
        pgxact->xid = xid;
index 7fecb381625236c47abf136ebe5870df02a21ffb..95989ce79bd6deb977edbbc92cc1ce176eddabcd 100644 (file)
@@ -1856,7 +1856,7 @@ WaitOnLock(LOCALLOCK *locallock, ResourceOwner owner)
         */
        PG_TRY();
        {
-               if (ProcSleep(locallock, lockMethodTable) != STATUS_OK)
+               if (ProcSleep(locallock, lockMethodTable) != PROC_WAIT_STATUS_OK)
                {
                        /*
                         * We failed as a result of a deadlock, see CheckDeadLock(). Quit
@@ -1907,7 +1907,7 @@ WaitOnLock(LOCALLOCK *locallock, ResourceOwner owner)
 /*
  * Remove a proc from the wait-queue it is on (caller must know it is on one).
  * This is only used when the proc has failed to get the lock, so we set its
- * waitStatus to STATUS_ERROR.
+ * waitStatus to PROC_WAIT_STATUS_ERROR.
  *
  * Appropriate partition lock must be held by caller.  Also, caller is
  * responsible for signaling the proc if needed.
@@ -1923,7 +1923,7 @@ RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode)
        LOCKMETHODID lockmethodid = LOCK_LOCKMETHOD(*waitLock);
 
        /* Make sure proc is waiting */
-       Assert(proc->waitStatus == STATUS_WAITING);
+       Assert(proc->waitStatus == PROC_WAIT_STATUS_WAITING);
        Assert(proc->links.next != NULL);
        Assert(waitLock);
        Assert(waitLock->waitProcs.size > 0);
@@ -1946,7 +1946,7 @@ RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode)
        /* Clean up the proc's own state, and pass it the ok/fail signal */
        proc->waitLock = NULL;
        proc->waitProcLock = NULL;
-       proc->waitStatus = STATUS_ERROR;
+       proc->waitStatus = PROC_WAIT_STATUS_ERROR;
 
        /*
         * Delete the proclock immediately if it represents no already-held locks.
index f5eef6fa4ee5d0112ed0bc33addbc3fc60882d47..e57fcd253880c31581dccc7b53f026dc6b18f2d2 100644 (file)
@@ -383,7 +383,7 @@ InitProcess(void)
         * initialized by InitProcGlobal.
         */
        SHMQueueElemInit(&(MyProc->links));
-       MyProc->waitStatus = STATUS_OK;
+       MyProc->waitStatus = PROC_WAIT_STATUS_OK;
        MyProc->lxid = InvalidLocalTransactionId;
        MyProc->fpVXIDLock = false;
        MyProc->fpLocalTransactionId = InvalidLocalTransactionId;
@@ -567,7 +567,7 @@ InitAuxiliaryProcess(void)
         * initialized by InitProcGlobal.
         */
        SHMQueueElemInit(&(MyProc->links));
-       MyProc->waitStatus = STATUS_OK;
+       MyProc->waitStatus = PROC_WAIT_STATUS_OK;
        MyProc->lxid = InvalidLocalTransactionId;
        MyProc->fpVXIDLock = false;
        MyProc->fpLocalTransactionId = InvalidLocalTransactionId;
@@ -755,7 +755,7 @@ LockErrorCleanup(void)
                 * did grant us the lock, we'd better remember it in our local lock
                 * table.
                 */
-               if (MyProc->waitStatus == STATUS_OK)
+               if (MyProc->waitStatus == PROC_WAIT_STATUS_OK)
                        GrantAwaitedLock();
        }
 
@@ -1051,14 +1051,14 @@ ProcQueueInit(PROC_QUEUE *queue)
  * The lock table's partition lock must be held at entry, and will be held
  * at exit.
  *
- * Result: STATUS_OK if we acquired the lock, STATUS_ERROR if not (deadlock).
+ * Result: PROC_WAIT_STATUS_OK if we acquired the lock, PROC_WAIT_STATUS_ERROR if not (deadlock).
  *
  * ASSUME: that no one will fiddle with the queue until after
  *             we release the partition lock.
  *
  * NOTES: The process queue is now a priority queue for locking.
  */
-int
+ProcWaitStatus
 ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
 {
        LOCKMODE        lockmode = locallock->tag.mode;
@@ -1070,7 +1070,7 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
        LOCKMASK        myHeldLocks = MyProc->heldLocks;
        bool            early_deadlock = false;
        bool            allow_autovacuum_cancel = true;
-       int                     myWaitStatus;
+       ProcWaitStatus myWaitStatus;
        PGPROC     *proc;
        PGPROC     *leader = MyProc->lockGroupLeader;
        int                     i;
@@ -1161,7 +1161,7 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
                                        /* Skip the wait and just grant myself the lock. */
                                        GrantLock(lock, proclock, lockmode);
                                        GrantAwaitedLock();
-                                       return STATUS_OK;
+                                       return PROC_WAIT_STATUS_OK;
                                }
                                /* Break out of loop to put myself before him */
                                break;
@@ -1195,7 +1195,7 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
        MyProc->waitProcLock = proclock;
        MyProc->waitLockMode = lockmode;
 
-       MyProc->waitStatus = STATUS_WAITING;
+       MyProc->waitStatus = PROC_WAIT_STATUS_WAITING;
 
        /*
         * If we detected deadlock, give up without waiting.  This must agree with
@@ -1204,7 +1204,7 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
        if (early_deadlock)
        {
                RemoveFromWaitQueue(MyProc, hashcode);
-               return STATUS_ERROR;
+               return PROC_WAIT_STATUS_ERROR;
        }
 
        /* mark that we are waiting for a lock */
@@ -1236,7 +1236,7 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
        /*
         * Set timer so we can wake up after awhile and check for a deadlock. If a
         * deadlock is detected, the handler sets MyProc->waitStatus =
-        * STATUS_ERROR, allowing us to know that we must report failure rather
+        * PROC_WAIT_STATUS_ERROR, allowing us to know that we must report failure rather
         * than success.
         *
         * By delaying the check until we've waited for a bit, we can avoid
@@ -1302,11 +1302,11 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
                }
 
                /*
-                * waitStatus could change from STATUS_WAITING to something else
+                * waitStatus could change from PROC_WAIT_STATUS_WAITING to something else
                 * asynchronously.  Read it just once per loop to prevent surprising
                 * behavior (such as missing log messages).
                 */
-               myWaitStatus = *((volatile int *) &MyProc->waitStatus);
+               myWaitStatus = *((volatile ProcWaitStatus *) &MyProc->waitStatus);
 
                /*
                 * If we are not deadlocked, but are waiting on an autovacuum-induced
@@ -1487,24 +1487,24 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
                                                                                           lockHoldersNum, lock_holders_sbuf.data, lock_waiters_sbuf.data))));
                        }
 
-                       if (myWaitStatus == STATUS_WAITING)
+                       if (myWaitStatus == PROC_WAIT_STATUS_WAITING)
                                ereport(LOG,
                                                (errmsg("process %d still waiting for %s on %s after %ld.%03d ms",
                                                                MyProcPid, modename, buf.data, msecs, usecs),
                                                 (errdetail_log_plural("Process holding the lock: %s. Wait queue: %s.",
                                                                                           "Processes holding the lock: %s. Wait queue: %s.",
                                                                                           lockHoldersNum, lock_holders_sbuf.data, lock_waiters_sbuf.data))));
-                       else if (myWaitStatus == STATUS_OK)
+                       else if (myWaitStatus == PROC_WAIT_STATUS_OK)
                                ereport(LOG,
                                                (errmsg("process %d acquired %s on %s after %ld.%03d ms",
                                                                MyProcPid, modename, buf.data, msecs, usecs)));
                        else
                        {
-                               Assert(myWaitStatus == STATUS_ERROR);
+                               Assert(myWaitStatus == PROC_WAIT_STATUS_ERROR);
 
                                /*
                                 * Currently, the deadlock checker always kicks its own
-                                * process, which means that we'll only see STATUS_ERROR when
+                                * process, which means that we'll only see PROC_WAIT_STATUS_ERROR when
                                 * deadlock_state == DS_HARD_DEADLOCK, and there's no need to
                                 * print redundant messages.  But for completeness and
                                 * future-proofing, print a message if it looks like someone
@@ -1529,7 +1529,7 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
                        pfree(lock_holders_sbuf.data);
                        pfree(lock_waiters_sbuf.data);
                }
-       } while (myWaitStatus == STATUS_WAITING);
+       } while (myWaitStatus == PROC_WAIT_STATUS_WAITING);
 
        /*
         * Disable the timers, if they are still running.  As in LockErrorCleanup,
@@ -1568,7 +1568,7 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
        /*
         * If we got the lock, be sure to remember it in the locallock table.
         */
-       if (MyProc->waitStatus == STATUS_OK)
+       if (MyProc->waitStatus == PROC_WAIT_STATUS_OK)
                GrantAwaitedLock();
 
        /*
@@ -1590,10 +1590,10 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
  * XXX: presently, this code is only used for the "success" case, and only
  * works correctly for that case.  To clean up in failure case, would need
  * to twiddle the lock's request counts too --- see RemoveFromWaitQueue.
- * Hence, in practice the waitStatus parameter must be STATUS_OK.
+ * Hence, in practice the waitStatus parameter must be PROC_WAIT_STATUS_OK.
  */
 PGPROC *
-ProcWakeup(PGPROC *proc, int waitStatus)
+ProcWakeup(PGPROC *proc, ProcWaitStatus waitStatus)
 {
        PGPROC     *retProc;
 
@@ -1601,7 +1601,7 @@ ProcWakeup(PGPROC *proc, int waitStatus)
        if (proc->links.prev == NULL ||
                proc->links.next == NULL)
                return NULL;
-       Assert(proc->waitStatus == STATUS_WAITING);
+       Assert(proc->waitStatus == PROC_WAIT_STATUS_WAITING);
 
        /* Save next process before we zap the list link */
        retProc = (PGPROC *) proc->links.next;
@@ -1657,7 +1657,7 @@ ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock)
                {
                        /* OK to waken */
                        GrantLock(lock, proc->waitProcLock, lockmode);
-                       proc = ProcWakeup(proc, STATUS_OK);
+                       proc = ProcWakeup(proc, PROC_WAIT_STATUS_OK);
 
                        /*
                         * ProcWakeup removes proc from the lock's waiting process queue
@@ -1737,7 +1737,7 @@ CheckDeadLock(void)
                 * preserve the flexibility to kill some other transaction than the
                 * one detecting the deadlock.)
                 *
-                * RemoveFromWaitQueue sets MyProc->waitStatus to STATUS_ERROR, so
+                * RemoveFromWaitQueue sets MyProc->waitStatus to PROC_WAIT_STATUS_ERROR, so
                 * ProcSleep will report an error after we return from the signal
                 * handler.
                 */
index d72b23afe4ce6cb287396dd71838ee533d66bb5f..a904b49a37fd5f84d08177098d5e16793d0787fe 100644 (file)
@@ -1133,7 +1133,6 @@ typedef union PGAlignedXLogBlock
 #define STATUS_OK                              (0)
 #define STATUS_ERROR                   (-1)
 #define STATUS_EOF                             (-2)
-#define STATUS_WAITING                 (2)
 
 /*
  * gettext support
index 1ee9000b2b9c443bc022be30966e2f30c6d4404d..b20e2ad4f6aa3ad1f8226eb349e12e6dc96be87e 100644 (file)
@@ -76,6 +76,13 @@ struct XidCache
  */
 #define INVALID_PGPROCNO               PG_INT32_MAX
 
+typedef enum
+{
+       PROC_WAIT_STATUS_OK,
+       PROC_WAIT_STATUS_WAITING,
+       PROC_WAIT_STATUS_ERROR,
+} ProcWaitStatus;
+
 /*
  * Each backend has a PGPROC struct in shared memory.  There is also a list of
  * currently-unused PGPROC structs that will be reallocated to new backends.
@@ -99,7 +106,7 @@ struct PGPROC
        PGPROC    **procgloballist; /* procglobal list that owns this PGPROC */
 
        PGSemaphore sem;                        /* ONE semaphore to sleep on */
-       int                     waitStatus;             /* STATUS_WAITING, STATUS_OK or STATUS_ERROR */
+       ProcWaitStatus waitStatus;
 
        Latch           procLatch;              /* generic latch for process */
 
@@ -315,8 +322,8 @@ extern bool HaveNFreeProcs(int n);
 extern void ProcReleaseLocks(bool isCommit);
 
 extern void ProcQueueInit(PROC_QUEUE *queue);
-extern int     ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable);
-extern PGPROC *ProcWakeup(PGPROC *proc, int waitStatus);
+extern ProcWaitStatus ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable);
+extern PGPROC *ProcWakeup(PGPROC *proc, ProcWaitStatus waitStatus);
 extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock);
 extern void CheckDeadLockAlert(void);
 extern bool IsWaitingForLock(void);