diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 8b61475f6d13bf9f4eddda0745ceb3a7c3aa1c89..5cca8a9429020849aa3ca8f97e76439f071c22dc 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -295,13 +295,6 @@ InitProcGlobal(void) /* Create ProcStructLock spinlock, too */ ProcStructLock = (slock_t *) ShmemAlloc(sizeof(slock_t)); SpinLockInit(ProcStructLock); - - /* - * GPDB: numFreeProcs is used to keep track of the - * number of free PGPROC entries in freeProcs list, - * and will accelerate HaveNFreeProcs(). - */ - ProcGlobal->numFreeProcs = MaxConnections; } /* @@ -351,17 +344,9 @@ InitProcess(void) if (MyProc != NULL) { if (IsAnyAutoVacuumProcess()) - { procglobal->autovacFreeProcs = (PGPROC *) MyProc->links.next; - } else - { procglobal->freeProcs = (PGPROC *) MyProc->links.next; - - procglobal->numFreeProcs--; /* we removed an entry from the list. */ - Assert(procglobal->numFreeProcs >= 0); - } - SpinLockRelease(ProcStructLock); } else @@ -712,13 +697,30 @@ GetStartupBufferPinWaitBufId(void) /* * Check whether there are at least N free PGPROC objects. + * + * Note: this is designed on the assumption that N will generally be small. */ bool HaveNFreeProcs(int n) { - Assert(n >= 0); + PGPROC *proc; - return (ProcGlobal->numFreeProcs >= n); + /* use volatile pointer to prevent code rearrangement */ + volatile PROC_HDR *procglobal = ProcGlobal; + + SpinLockAcquire(ProcStructLock); + + proc = procglobal->freeProcs; + + while (n > 0 && proc != NULL) + { + proc = (PGPROC *) proc->links.next; + n--; + } + + SpinLockRelease(ProcStructLock); + + return (n <= 0); } /* @@ -950,8 +952,6 @@ ProcKill(int code, Datum arg) { proc->links.next = (SHM_QUEUE *) procglobal->freeProcs; procglobal->freeProcs = proc; - - procglobal->numFreeProcs++; /* we added an entry */ } diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index 99d77cd8f3e46e0e578cef0314dcc223f8c7a2f0..0ae9f7733cb7ae6720721c6d78d7230bd4dac8d8 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -254,9 +254,6 @@ typedef struct PROC_HDR /* Counter for assigning serial numbers to processes */ int mppLocalProcessCounter; - - /* Number of free PGPROC entries in freeProcs list. */ - int numFreeProcs; } PROC_HDR; extern PROC_HDR *ProcGlobal;