public PHeader(byte[] byteArray) { byte[] blockTypeByteArray = new byte[4]; Array.Copy(byteArray, 0, blockTypeByteArray, 0, 4); byte[] blockNumberOfPagesByteArray = new byte[4]; Array.Copy(byteArray, 4, blockNumberOfPagesByteArray, 0, 4); byte[] blockPageIndexByteArray = new byte[4]; Array.Copy(byteArray, 8, blockPageIndexByteArray, 0, 4); this.pageType = TypeOfPage.ValueOf(BitConverter.ToInt32(blockTypeByteArray)); this.blockNumberOfPages = BitConverter.ToInt32(blockNumberOfPagesByteArray); this.blockPageIndex = BitConverter.ToInt32(blockPageIndexByteArray); }
public static TypeOfPage ValueOf(int size) { TypeOfPage pageType = null; foreach (var el in TypeOfPage.Values) { if (el.Size == size) { pageType = el; } } return(pageType); }
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 PHeader() { pageType = TypeOfPage.EMPTY;// по дефолту любая страница свободна }