private void FillPages() { PHeader pageHeader = new PHeader(); byte[] pageHeaderByteArray = pageHeader.ToByteArray(); int index = 0; while (index < _buffer.Length) { Array.Copy(pageHeaderByteArray, 0, _buffer, index, pageHeaderByteArray.Length); index += PHeader.PAGE_TOTAL_SIZE; } }
private void FillPage(int index, PHeader pageHeader) { TypeOfPage pageType = pageHeader.pageType; CreatePageHeader(index, pageHeader); BHeader blockHeader = new BHeader(); int blockHeaderIndex = index + PHeader.PAGE_HEADER_SIZE; while (blockHeaderIndex < index + PHeader.PAGE_TOTAL_SIZE) { CreateBlockHeader(blockHeaderIndex, blockHeader); blockHeaderIndex += BHeader.BLOCK_HEADER_SIZE + pageType.Size; } }
public byte[] ReadArray(int index) { if (!CheckIndex(index)) { throw new IndexOutOfRangeException(); } int pageHeaderIndex = GetPageHeaderIndex(index); PHeader pageHeader = GetPageHeader(pageHeaderIndex); TypeOfPage pageType = pageHeader.pageType; int readArrayLength = pageType.Size; byte[] readArray = new byte[readArrayLength]; Array.Copy(_buffer, index + BHeader.BLOCK_HEADER_SIZE, readArray, 0, readArrayLength); return(readArray); }
private int GetPageFreeBlockIndex(int index) { PHeader pageHeader = GetPageHeader(index); TypeOfPage pageType = pageHeader.pageType; int blockHeaderIndex = index + PHeader.PAGE_HEADER_SIZE; while (blockHeaderIndex < index + PHeader.PAGE_TOTAL_SIZE) { BHeader blockHeader = GetBlockHeader(blockHeaderIndex); if (blockHeader.IsFree) { return(blockHeaderIndex); } blockHeaderIndex += BHeader.BLOCK_HEADER_SIZE + pageType.Size; } return(-1); }
public int MemAllocate(int size) { TypeOfPage pageType = PHeader.GetTypeBySize(size); int pageIndex = 0; int index = -1; while (index == -1 && pageIndex < _size - PHeader.PAGE_HEADER_SIZE) { PHeader pageHeader = GetPageHeader(pageIndex); TypeOfPage currentPageType = pageHeader.pageType; if (currentPageType == pageType) { int freeBlockPosition = GetPageFreeBlockIndex(pageIndex); index = freeBlockPosition >= 0 ? freeBlockPosition : index; } else if (currentPageType == TypeOfPage.EMPTY) { pageHeader.pageType = pageType; FillPage(pageIndex, pageHeader); index = pageIndex + PHeader.PAGE_HEADER_SIZE; } pageIndex += PHeader.PAGE_TOTAL_SIZE; } if (index >= 0) { BHeader blockHeader = GetBlockHeader(index); blockHeader.IsFree = false; CreateBlockHeader(index, blockHeader); } return(index); }
public String MemDump() { String dump = ""; int index = 0; while (index < _size) { PHeader pageHeader = GetPageHeader(index); dump += pageHeader.ToString() + '\n'; int pageDataLength = PHeader.PAGE_TOTAL_SIZE - PHeader.PAGE_HEADER_SIZE; byte[] pageData = new byte[pageDataLength]; Array.Copy(_buffer, index + PHeader.PAGE_HEADER_SIZE, pageData, 0, pageDataLength); dump += BitConverter.ToString(pageData); dump += '\n'; index += PHeader.PAGE_TOTAL_SIZE; } return(dump); }
private void CreatePageHeader(int index, PHeader pageHeader) { byte[] pageHeaderByteArray = pageHeader.ToByteArray(); Array.Copy(pageHeaderByteArray, 0, _buffer, index, pageHeaderByteArray.Length); }