コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
 private void CreatePageHeader(int index, PHeader pageHeader)
 {
     byte[] pageHeaderByteArray = pageHeader.ToByteArray();
     Array.Copy(pageHeaderByteArray, 0, _buffer, index, pageHeaderByteArray.Length);
 }