@@ -122,7 +122,7 @@ init_fsm(Pointer ptr, bool found)
122
122
}
123
123
124
124
/* Initialize non-leafs */
125
- for (i = 0 ; i < fsm_non_leaf ; i ++ )
125
+ for (i = 0 ; i < FSM_BRANCH_FACTOR ; i ++ )
126
126
init_fsm_non_leaf_recursive (i );
127
127
}
128
128
@@ -142,6 +142,7 @@ fsm_get_page(void)
142
142
143
143
for (j = i ; j < i + FSM_BRANCH_FACTOR ; j ++ )
144
144
{
145
+ Assert (j >= 0 && j < fsm_non_leaf );
145
146
uint32 val = pg_atomic_read_u32 (& fsm [j ]);
146
147
if (val != 0 )
147
148
{
@@ -170,10 +171,13 @@ fsm_get_page(void)
170
171
{
171
172
uint32 val = pg_atomic_read_u32 (& fsm [j ]);
172
173
174
+ Assert (j >= fsm_non_leaf && j < fsm_total );
175
+
173
176
if (val != 0xFFFFFFFF )
174
177
{
175
- int bitno = 0 ;
176
- uint32 bit = (val + 1 ) & ~val ;
178
+ PageNumber result ;
179
+ int bitno = 0 ;
180
+ uint32 bit = (val + 1 ) & ~val ;
177
181
178
182
val = pg_atomic_fetch_or_u32 (& fsm [j ], bit );
179
183
if ((val & bit ) != 0 )
@@ -182,7 +186,9 @@ fsm_get_page(void)
182
186
bit >>= 1 ;
183
187
while (bit > 0 ) { bitno ++ ; bit >>= 1 ; }
184
188
Assert (bitno < 32 );
185
- return (j - fsm_non_leaf ) * 32 + bitno ;
189
+ result = (j - fsm_non_leaf ) * 32 + bitno ;
190
+ Assert (result <= shared_pool_size / IN_MEMORY_BLCKSZ );
191
+ return result ;
186
192
}
187
193
}
188
194
}
@@ -211,12 +217,15 @@ fsm_free_page(PageNumber pageno)
211
217
i = pageno / 32 + fsm_non_leaf ;
212
218
bitno = pageno % 32 ;
213
219
220
+ Assert (i >= fsm_non_leaf && i < fsm_total );
221
+
214
222
Assert ((pg_atomic_read_u32 (& fsm [i ]) & (1 << bitno )) != 0 );
215
223
pg_atomic_fetch_and_u32 (& fsm [i ], ~(1 << bitno ));
216
224
217
225
while (i >= FSM_BRANCH_FACTOR )
218
226
{
219
227
i = (i / FSM_BRANCH_FACTOR ) - 1 ;
228
+ Assert (i >= 0 && i < fsm_non_leaf );
220
229
pg_atomic_fetch_add_u32 (& fsm [i ], 1 );
221
230
}
222
231
}
0 commit comments