77 *
88 *
99 * IDENTIFICATION
10- * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinvaladt.c,v 1.19 1999/05/25 16:11:13 momjian Exp $
10+ * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinvaladt.c,v 1.20 1999/05/28 17:03:28 tgl Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
2121#include "storage/backendid.h"
2222#include "storage/sinvaladt.h"
2323#include "storage/lmgr.h"
24+ #include "utils/memutils.h"
2425#include "utils/palloc.h"
2526#include "utils/trace.h"
2627
@@ -115,11 +116,9 @@ static BackendId
115116SIAssignBackendId (SISeg * segInOutP ,BackendTag backendTag )
116117{
117118Index index ;
118- ProcState * stateP ;
119+ ProcState * stateP = NULL ;
119120
120- stateP = NULL ;
121-
122- for (index = 0 ;index < MAXBACKENDS ;index ++ )
121+ for (index = 0 ;index < segInOutP -> maxBackends ;index ++ )
123122{
124123if (segInOutP -> procState [index ].tag == InvalidBackendTag ||
125124segInOutP -> procState [index ].tag == backendTag )
@@ -141,7 +140,7 @@ SIAssignBackendId(SISeg *segInOutP, BackendTag backendTag)
141140
142141/* verify that all "procState" entries checked for matching tags */
143142
144- for (index ++ ;index < MAXBACKENDS ;index ++ )
143+ for (index ++ ;index < segInOutP -> maxBackends ;index ++ )
145144{
146145if (segInOutP -> procState [index ].tag == backendTag )
147146elog (FATAL ,"SIAssignBackendId: tag %d found twice" ,backendTag );
@@ -201,30 +200,29 @@ CleanupInvalidationState(int status,/* XXX */
201200
202201
203202/************************************************************************/
204- /* SIComputeSize()-retuns the sizeof a buffer segment */
203+ /* SIComputeSize()-compute sizeand offsets for SI segment*/
205204/************************************************************************/
206- static SISegOffsets *
207- SIComputeSize (int * segSize )
205+ static void
206+ SIComputeSize (SISegOffsets * oP , int maxBackends )
208207{
209208int A ,
210209B ,
211210a ,
212211b ,
213212totalSize ;
214- SISegOffsets * oP ;
215213
216214A = 0 ;
217- a = SizeSISeg ;/* offset to first data entry */
218- b = SizeOfOneSISegEntry * MAXNUMMESSAGES ;
215+ /* sizeof(SISeg) includes the first ProcState entry */
216+ a = sizeof (SISeg )+ sizeof (ProcState )* (maxBackends - 1 );
217+ a = MAXALIGN (a );/* offset to first data entry */
218+ b = sizeof (SISegEntry )* MAXNUMMESSAGES ;
219219B = A + a + b ;
220+ B = MAXALIGN (B );
220221totalSize = B - A ;
221- * segSize = totalSize ;
222222
223- oP = (SISegOffsets * )palloc (sizeof (SISegOffsets ));
224223oP -> startSegment = A ;
225- oP -> offsetToFirstEntry = a ;/* relatiove to A */
226- oP -> offsetToEndOfSegemnt = totalSize ;/* relative to A */
227- return oP ;
224+ oP -> offsetToFirstEntry = a ;/* relative to A */
225+ oP -> offsetToEndOfSegment = totalSize ;/* relative to A */
228226}
229227
230228
@@ -340,11 +338,9 @@ SISetMaxNumEntries(SISeg *segP, int num)
340338/************************************************************************/
341339/* SIGetProcStateLimit(segP, i) returns the limit of read messages*/
342340/************************************************************************/
343- static int
344- SIGetProcStateLimit (SISeg * segP ,int i )
345- {
346- return segP -> procState [i ].limit ;
347- }
341+
342+ #define SIGetProcStateLimit (segP ,i ) \
343+ ((segP)->procState[i].limit)
348344
349345/************************************************************************/
350346/* SIIncNumEntries(segP, num)increments the current nuber of entries */
@@ -557,7 +553,7 @@ SIDecProcLimit(SISeg *segP, int num)
557553{
558554int i ;
559555
560- for (i = 0 ;i < MAXBACKENDS ;i ++ )
556+ for (i = 0 ;i < segP -> maxBackends ;i ++ )
561557{
562558/* decrement only, if there is a limit > 0*/
563559if (segP -> procState [i ].limit > 0 )
@@ -614,7 +610,7 @@ SISetProcStateInvalid(SISeg *segP)
614610{
615611int i ;
616612
617- for (i = 0 ;i < MAXBACKENDS ;i ++ )
613+ for (i = 0 ;i < segP -> maxBackends ;i ++ )
618614{
619615if (segP -> procState [i ].limit == 0 )
620616{
@@ -688,7 +684,7 @@ SIDelExpiredDataEntries(SISeg *segP)
688684h ;
689685
690686min = 9999999 ;
691- for (i = 0 ;i < MAXBACKENDS ;i ++ )
687+ for (i = 0 ;i < segP -> maxBackends ;i ++ )
692688{
693689h = SIGetProcStateLimit (segP ,i );
694690if (h >=0 )
@@ -715,24 +711,22 @@ SIDelExpiredDataEntries(SISeg *segP)
715711/* SISegInit(segP)- initializes the segment*/
716712/************************************************************************/
717713static void
718- SISegInit (SISeg * segP )
714+ SISegInit (SISeg * segP , SISegOffsets * oP , int maxBackends )
719715{
720- SISegOffsets * oP ;
721- int segSize ,
722- i ;
716+ int i ;
723717SISegEntry * eP ;
724718
725- oP = SIComputeSize (& segSize );
726- /* set sempahore ids in the segment */
719+ /* set semaphore ids in the segment */
727720/* XXX */
728721SISetStartEntrySection (segP ,oP -> offsetToFirstEntry );
729- SISetEndEntrySection (segP ,oP -> offsetToEndOfSegemnt );
722+ SISetEndEntrySection (segP ,oP -> offsetToEndOfSegment );
730723SISetStartFreeSpace (segP ,0 );
731724SISetStartEntryChain (segP ,InvalidOffset );
732725SISetEndEntryChain (segP ,InvalidOffset );
733726SISetNumEntries (segP ,0 );
734727SISetMaxNumEntries (segP ,MAXNUMMESSAGES );
735- for (i = 0 ;i < MAXBACKENDS ;i ++ )
728+ segP -> maxBackends = maxBackends ;
729+ for (i = 0 ;i < segP -> maxBackends ;i ++ )
736730{
737731segP -> procState [i ].limit = -1 ;/* no backend active !! */
738732segP -> procState [i ].resetState = false;
@@ -753,12 +747,6 @@ SISegInit(SISeg *segP)
753747 (MAXNUMMESSAGES - 1 )* sizeof (SISegEntry ));
754748eP -> isfree = true;
755749eP -> next = InvalidOffset ;/* it's the end of the chain !! */
756-
757- /*
758- * Be tidy
759- */
760- pfree (oP );
761-
762750}
763751
764752
@@ -808,13 +796,14 @@ SISegmentAttach(IpcMemoryId shmid)
808796
809797
810798/************************************************************************/
811- /* SISegmentInit(killExistingSegment, key)initialize segment*/
799+ /* SISegmentInit()initialize SI segment*/
800+ /**/
801+ /* NB: maxBackends param is only valid when killExistingSegment is true*/
812802/************************************************************************/
813803int
814- SISegmentInit (bool killExistingSegment ,IPCKey key )
804+ SISegmentInit (bool killExistingSegment ,IPCKey key , int maxBackends )
815805{
816- SISegOffsets * oP ;
817- int segSize ;
806+ SISegOffsets offsets ;
818807IpcMemoryId shmId ;
819808bool create ;
820809
@@ -825,16 +814,9 @@ SISegmentInit(bool killExistingSegment, IPCKey key)
825814SISegmentKill (key );
826815
827816/* Get a shared segment */
828-
829- oP = SIComputeSize (& segSize );
830-
831- /*
832- * Be tidy
833- */
834- pfree (oP );
835-
817+ SIComputeSize (& offsets ,maxBackends );
836818create = true;
837- shmId = SISegmentGet (key ,segSize ,create );
819+ shmId = SISegmentGet (key ,offsets . offsetToEndOfSegment ,create );
838820if (shmId < 0 )
839821{
840822perror ("SISegmentGet: failed" );
@@ -846,7 +828,7 @@ SISegmentInit(bool killExistingSegment, IPCKey key)
846828SISegmentAttach (shmId );
847829
848830/* Init shared memory table */
849- SISegInit (shmInvalBuffer );
831+ SISegInit (shmInvalBuffer , & offsets , maxBackends );
850832}
851833else
852834{