7
7
*
8
8
*
9
9
* 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 $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
21
21
#include "storage/backendid.h"
22
22
#include "storage/sinvaladt.h"
23
23
#include "storage/lmgr.h"
24
+ #include "utils/memutils.h"
24
25
#include "utils/palloc.h"
25
26
#include "utils/trace.h"
26
27
@@ -115,11 +116,9 @@ static BackendId
115
116
SIAssignBackendId (SISeg * segInOutP , BackendTag backendTag )
116
117
{
117
118
Index index ;
118
- ProcState * stateP ;
119
+ ProcState * stateP = NULL ;
119
120
120
- stateP = NULL ;
121
-
122
- for (index = 0 ; index < MAXBACKENDS ; index ++ )
121
+ for (index = 0 ; index < segInOutP -> maxBackends ; index ++ )
123
122
{
124
123
if (segInOutP -> procState [index ].tag == InvalidBackendTag ||
125
124
segInOutP -> procState [index ].tag == backendTag )
@@ -141,7 +140,7 @@ SIAssignBackendId(SISeg *segInOutP, BackendTag backendTag)
141
140
142
141
/* verify that all "procState" entries checked for matching tags */
143
142
144
- for (index ++ ; index < MAXBACKENDS ; index ++ )
143
+ for (index ++ ; index < segInOutP -> maxBackends ; index ++ )
145
144
{
146
145
if (segInOutP -> procState [index ].tag == backendTag )
147
146
elog (FATAL , "SIAssignBackendId: tag %d found twice" , backendTag );
@@ -201,30 +200,29 @@ CleanupInvalidationState(int status, /* XXX */
201
200
202
201
203
202
/************************************************************************/
204
- /* SIComputeSize() - retuns the size of a buffer segment */
203
+ /* SIComputeSize() - compute size and offsets for SI segment */
205
204
/************************************************************************/
206
- static SISegOffsets *
207
- SIComputeSize (int * segSize )
205
+ static void
206
+ SIComputeSize (SISegOffsets * oP , int maxBackends )
208
207
{
209
208
int A ,
210
209
B ,
211
210
a ,
212
211
b ,
213
212
totalSize ;
214
- SISegOffsets * oP ;
215
213
216
214
A = 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 ;
219
219
B = A + a + b ;
220
+ B = MAXALIGN (B );
220
221
totalSize = B - A ;
221
- * segSize = totalSize ;
222
222
223
- oP = (SISegOffsets * ) palloc (sizeof (SISegOffsets ));
224
223
oP -> 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 */
228
226
}
229
227
230
228
@@ -340,11 +338,9 @@ SISetMaxNumEntries(SISeg *segP, int num)
340
338
/************************************************************************/
341
339
/* SIGetProcStateLimit(segP, i) returns the limit of read messages */
342
340
/************************************************************************/
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)
348
344
349
345
/************************************************************************/
350
346
/* SIIncNumEntries(segP, num) increments the current nuber of entries */
@@ -557,7 +553,7 @@ SIDecProcLimit(SISeg *segP, int num)
557
553
{
558
554
int i ;
559
555
560
- for (i = 0 ; i < MAXBACKENDS ; i ++ )
556
+ for (i = 0 ; i < segP -> maxBackends ; i ++ )
561
557
{
562
558
/* decrement only, if there is a limit > 0 */
563
559
if (segP -> procState [i ].limit > 0 )
@@ -614,7 +610,7 @@ SISetProcStateInvalid(SISeg *segP)
614
610
{
615
611
int i ;
616
612
617
- for (i = 0 ; i < MAXBACKENDS ; i ++ )
613
+ for (i = 0 ; i < segP -> maxBackends ; i ++ )
618
614
{
619
615
if (segP -> procState [i ].limit == 0 )
620
616
{
@@ -688,7 +684,7 @@ SIDelExpiredDataEntries(SISeg *segP)
688
684
h ;
689
685
690
686
min = 9999999 ;
691
- for (i = 0 ; i < MAXBACKENDS ; i ++ )
687
+ for (i = 0 ; i < segP -> maxBackends ; i ++ )
692
688
{
693
689
h = SIGetProcStateLimit (segP , i );
694
690
if (h >= 0 )
@@ -715,24 +711,22 @@ SIDelExpiredDataEntries(SISeg *segP)
715
711
/* SISegInit(segP) - initializes the segment */
716
712
/************************************************************************/
717
713
static void
718
- SISegInit (SISeg * segP )
714
+ SISegInit (SISeg * segP , SISegOffsets * oP , int maxBackends )
719
715
{
720
- SISegOffsets * oP ;
721
- int segSize ,
722
- i ;
716
+ int i ;
723
717
SISegEntry * eP ;
724
718
725
- oP = SIComputeSize (& segSize );
726
- /* set sempahore ids in the segment */
719
+ /* set semaphore ids in the segment */
727
720
/* XXX */
728
721
SISetStartEntrySection (segP , oP -> offsetToFirstEntry );
729
- SISetEndEntrySection (segP , oP -> offsetToEndOfSegemnt );
722
+ SISetEndEntrySection (segP , oP -> offsetToEndOfSegment );
730
723
SISetStartFreeSpace (segP , 0 );
731
724
SISetStartEntryChain (segP , InvalidOffset );
732
725
SISetEndEntryChain (segP , InvalidOffset );
733
726
SISetNumEntries (segP , 0 );
734
727
SISetMaxNumEntries (segP , MAXNUMMESSAGES );
735
- for (i = 0 ; i < MAXBACKENDS ; i ++ )
728
+ segP -> maxBackends = maxBackends ;
729
+ for (i = 0 ; i < segP -> maxBackends ; i ++ )
736
730
{
737
731
segP -> procState [i ].limit = -1 ; /* no backend active !! */
738
732
segP -> procState [i ].resetState = false;
@@ -753,12 +747,6 @@ SISegInit(SISeg *segP)
753
747
(MAXNUMMESSAGES - 1 ) * sizeof (SISegEntry ));
754
748
eP -> isfree = true;
755
749
eP -> next = InvalidOffset ; /* it's the end of the chain !! */
756
-
757
- /*
758
- * Be tidy
759
- */
760
- pfree (oP );
761
-
762
750
}
763
751
764
752
@@ -808,13 +796,14 @@ SISegmentAttach(IpcMemoryId shmid)
808
796
809
797
810
798
/************************************************************************/
811
- /* SISegmentInit(killExistingSegment, key) initialize segment */
799
+ /* SISegmentInit() initialize SI segment */
800
+ /* */
801
+ /* NB: maxBackends param is only valid when killExistingSegment is true */
812
802
/************************************************************************/
813
803
int
814
- SISegmentInit (bool killExistingSegment , IPCKey key )
804
+ SISegmentInit (bool killExistingSegment , IPCKey key , int maxBackends )
815
805
{
816
- SISegOffsets * oP ;
817
- int segSize ;
806
+ SISegOffsets offsets ;
818
807
IpcMemoryId shmId ;
819
808
bool create ;
820
809
@@ -825,16 +814,9 @@ SISegmentInit(bool killExistingSegment, IPCKey key)
825
814
SISegmentKill (key );
826
815
827
816
/* Get a shared segment */
828
-
829
- oP = SIComputeSize (& segSize );
830
-
831
- /*
832
- * Be tidy
833
- */
834
- pfree (oP );
835
-
817
+ SIComputeSize (& offsets , maxBackends );
836
818
create = true;
837
- shmId = SISegmentGet (key , segSize , create );
819
+ shmId = SISegmentGet (key , offsets . offsetToEndOfSegment , create );
838
820
if (shmId < 0 )
839
821
{
840
822
perror ("SISegmentGet: failed" );
@@ -846,7 +828,7 @@ SISegmentInit(bool killExistingSegment, IPCKey key)
846
828
SISegmentAttach (shmId );
847
829
848
830
/* Init shared memory table */
849
- SISegInit (shmInvalBuffer );
831
+ SISegInit (shmInvalBuffer , & offsets , maxBackends );
850
832
}
851
833
else
852
834
{
0 commit comments