private void PrepareSegments()
{
if(segments != null)
{
// this is because in case of loading the starting memory snapshot
// after deserialization (i.e. resetting after deserialization)
// memory segments would have been lost
return;
}
// how many segments we need?
var segmentsNo = size / SegmentSize + (size % SegmentSize != 0 ? 1 : 0);
this.NoisyLog(string.Format("Preparing {0} segments for {1} bytes of memory, each {2} bytes long.",
segmentsNo, size, SegmentSize));
segments = new IntPtr[segmentsNo];
originalPointers = new IntPtr[segmentsNo];
// segments are not allocated until they are used by read, write, load etc (or touched)
describedSegments = new IMappedSegment[segmentsNo];
for(var i = 0; i < describedSegments.Length - 1; i++)
{
describedSegments[i] = new MappedSegment(this, i, (uint)SegmentSize);
}
var last = describedSegments.Length - 1;
var sizeOfLast = size % (uint)SegmentSize;
if(sizeOfLast == 0)
{
sizeOfLast = (uint)SegmentSize;
}
describedSegments[last] = new MappedSegment(this, last, sizeOfLast);
}