aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/ipc
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/storage/ipc')
-rw-r--r--src/backend/storage/ipc/sinval.c26
-rw-r--r--src/backend/storage/ipc/sinvaladt.c31
2 files changed, 43 insertions, 14 deletions
diff --git a/src/backend/storage/ipc/sinval.c b/src/backend/storage/ipc/sinval.c
index 940ab32b331..745a9c068de 100644
--- a/src/backend/storage/ipc/sinval.c
+++ b/src/backend/storage/ipc/sinval.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.49 2002/06/20 20:29:35 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.50 2002/08/29 21:02:12 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -538,3 +538,27 @@ BackendIdGetProc(BackendId procId)
return NULL;
}
+
+/*
+ * CountEmptyBackendSlots - count empty slots in backend process table
+ *
+ * Doesn't count since the procState array could be large and we've already
+ * allowed for that by running a freeBackends counter in the SI segment.
+ * Unlike CountActiveBackends() we do not need to interrogate the
+ * backends to determine the free slot count.
+ * Goes for a lock despite being a trival look up in case other backends
+ * are busy starting or exiting since there is scope for confusion.
+ */
+int
+CountEmptyBackendSlots(void)
+{
+ int count;
+
+ LWLockAcquire(SInvalLock, LW_SHARED);
+
+ count = shmInvalBuffer->freeBackends;
+
+ LWLockRelease(SInvalLock);
+
+ return count;
+}
diff --git a/src/backend/storage/ipc/sinvaladt.c b/src/backend/storage/ipc/sinvaladt.c
index c88055c07b5..b4ab1689f94 100644
--- a/src/backend/storage/ipc/sinvaladt.c
+++ b/src/backend/storage/ipc/sinvaladt.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinvaladt.c,v 1.47 2002/06/20 20:29:35 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinvaladt.c,v 1.48 2002/08/29 21:02:12 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -60,6 +60,7 @@ SIBufferInit(int maxBackends)
segP->maxMsgNum = 0;
segP->lastBackend = 0;
segP->maxBackends = maxBackends;
+ segP->freeBackends = maxBackends;
/* The buffer[] array is initially all unused, so we need not fill it */
@@ -91,6 +92,13 @@ SIBackendInit(SISeg *segP)
int index;
ProcState *stateP = NULL;
+ if (segP->freeBackends == 0)
+ {
+ /* out of procState slots */
+ MyBackendId = InvalidBackendId;
+ return 0;
+ }
+
/* Look for a free entry in the procState array */
for (index = 0; index < segP->lastBackend; index++)
{
@@ -103,18 +111,9 @@ SIBackendInit(SISeg *segP)
if (stateP == NULL)
{
- if (segP->lastBackend < segP->maxBackends)
- {
- stateP = &segP->procState[segP->lastBackend];
- Assert(stateP->nextMsgNum < 0);
- segP->lastBackend++;
- }
- else
- {
- /* out of procState slots */
- MyBackendId = InvalidBackendId;
- return 0;
- }
+ stateP = &segP->procState[segP->lastBackend];
+ Assert(stateP->nextMsgNum < 0);
+ segP->lastBackend++;
}
MyBackendId = (stateP - &segP->procState[0]) + 1;
@@ -123,6 +122,9 @@ SIBackendInit(SISeg *segP)
elog(DEBUG1, "SIBackendInit: backend id %d", MyBackendId);
#endif /* INVALIDDEBUG */
+ /* Reduce free slot count */
+ segP->freeBackends--;
+
/* mark myself active, with all extant messages already read */
stateP->nextMsgNum = segP->maxMsgNum;
stateP->resetState = false;
@@ -166,6 +168,9 @@ CleanupInvalidationState(int status, Datum arg)
}
segP->lastBackend = i;
+ /* Adjust free slot count */
+ segP->freeBackends++;
+
LWLockRelease(SInvalLock);
}