diff options
Diffstat (limited to 'src/backend/storage/ipc')
-rw-r--r-- | src/backend/storage/ipc/sinval.c | 26 | ||||
-rw-r--r-- | src/backend/storage/ipc/sinvaladt.c | 31 |
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); } |