private static void GrowStackDisposal(int desiredSize)
{
//Since these depths are relatively small, growing them both together has minor consequence.
lock (SyncRoot)
{
while (s_stackDisposalStackMessages == null || s_stackDisposalStackMessages.Length < desiredSize)
{
//Note: both are grown together and completely reinitialized to improve
// locality of reference.
int lastSize = s_stackDisposalStackMessages?.Length ?? 2;
StackDisposal[] stackMessages = new StackDisposal[lastSize * 2];
for (int x = 0; x < stackMessages.Length; x++)
{
stackMessages[x] = new StackDisposal(x, DisposeStackMessage);
}
StackDisposal[] suppressionFlags = new StackDisposal[lastSize * 2];
for (int x = 0; x < suppressionFlags.Length; x++)
{
suppressionFlags[x] = new StackDisposal(x, DisposeSuppressionFlags);
}
s_stackDisposalStackMessages = stackMessages;
s_stackDisposalSuppressionFlags = suppressionFlags;
}
}
}