filehdr.cc
来自「操作系统课程设计。在UNIX平台下实现Solary操作系统的一些功能」· CC 代码 · 共 792 行 · 第 1/2 页
CC
792 行
tmp += writeSize; }//end for(int...) int firstAddrsSlot = zMap->Find(); synchDisk->s_WriteDataInSector(firstAddrsSlot, 0, 128, (char*)firstAddrs); s_dataSectors[3] = firstAddrsSlot; if (leftSize > 0) second = 1; }//end if (direct == 1) /// ///begin to write data in first indirect index /// else { int firstAddrSlot; int firstLastSlot = (numBytes - maxDirect*128) / 128; if (lastOffset == 0 && firstLastSlot == 0) { int firstAddr = zMap->Find(); s_dataSectors[3] = firstAddr; firstLastSlot = 0; }//end if (lastOffset != 0) else { firstAddrSlot = s_dataSectors[3]; synchDisk->s_ReadDataInSector(firstAddrSlot, 0, 128, (char*)firstAddrs); }//end if (lastOffset != 0) else if (lastOffset != 0 && second == 0) { int leftInOneSlot = 128 - lastOffset; int writeSector = s_dataSectors[firstLastSlot]; synchDisk->s_WriteDataInSector(writeSector, lastOffset, leftInOneSlot, tmp); tmp += leftInOneSlot; leftSize -= leftInOneSlot; firstLastSlot += 1; }//end if (lastOffset!=0) for (int i = firstLastSlot; i < 32 && leftSize > 0; i++, leftSize-=128) { int writeSlot = zMap->Find(); int writeSize = 128; if (leftSize < 128) writeSize = leftSize; firstAddrs[i] = writeSlot; synchDisk->s_WriteDataInSector(writeSlot, 0, writeSize, tmp); tmp += writeSize; }//end for (int i ...) synchDisk->s_WriteDataInSector(s_dataSectors[3], 0, 128, (char*)firstAddrs); /// ///determine whether to use second indirect index /// if (leftSize > 0) second = 1; }//end if (direct == 1) else }//end if (first == 1)//////second indirect index/// if (second == 1) { if (first == 1) { int secondAddrs[32]; int secondMidAddrs[32]; for (int j = 0; j < 32 && leftSize > 0; j++) { for (int i = 0; i < 32 && leftSize > 0; i++, leftSize-=128) { int writeSlot = zMap->Find(); int writeSize = 128; if (leftSize < 128) writeSize = leftSize; secondAddrs[i] = writeSlot; synchDisk->s_WriteDataInSector(writeSlot, 0, writeSize, tmp); tmp += writeSize; }//for (int i...) int midSlot = zMap->Find(); secondMidAddrs[j] = midSlot; synchDisk->s_WriteDataInSector(midSlot, 0, 128, (char*)secondAddrs); }//for (int j...) int secondAddr = zMap->Find(); s_dataSectors[4] = secondAddr; synchDisk->s_WriteDataInSector(secondAddr, 0, 128, (char*)secondMidAddrs); if (leftSize > 0) third = 1; }//end if (first == 1) else { int secondAddrs[32]; int secondMidAddrs[32]; int lastMid = (leftSize / 128 - maxFirst)/32; int lastOffsetSlot = (leftSize / 128 - maxFirst)%32; synchDisk->s_ReadDataInSector(s_dataSectors[4], 0, 128, (char*)secondMidAddrs); for (int j = lastMid; j < 32 && leftSize > 0; j++) { synchDisk->s_ReadDataInSector(secondMidAddrs[j], 0, 128, (char*)secondAddrs); if (lastOffset != 0 && j == lastMid) { int leftInOneSlot = 128 - lastOffset; int writeSector = secondAddrs[lastOffsetSlot]; synchDisk->s_WriteDataInSector(writeSector, lastOffset, leftInOneSlot, tmp); tmp += leftInOneSlot; leftSize -= leftInOneSlot; lastOffsetSlot += 1; }//end if (lastOffset!=0) for (int i = 0; i < 32 && leftSize > 0; i++, leftSize-=128) { int writeSlot = zMap->Find(); int writeSize = 128; if (leftSize < 128) writeSize = leftSize; secondAddrs[i] = writeSlot; synchDisk->s_WriteDataInSector(writeSlot, 0, writeSize, tmp); tmp += writeSize; }//for (int i...) if (j != lastMid) { int midSlot = zMap->Find(); secondMidAddrs[j] = midSlot; synchDisk->s_WriteDataInSector(midSlot, 0, 128, (char*)secondAddrs); }//end if (j != lastMid) }//for (int j...) synchDisk->s_WriteDataInSector(s_dataSectors[4], 0, 128, (char*)secondMidAddrs); /// ///determine whether to use third indirect index /// if (leftSize > 0) third = 1; }//end if (first == 1) else }//end if (second == 1) ////// third indirect index/// if (third == 1) { if (second == 1) { int thirdAddrs[32]; int thirdFirstMidAddrs[32]; int thirdSecMidAddrs[32]; for (int k = 0; k < 32 && leftSize > 0; k++) { for (int j = 0; j < 32 && leftSize > 0; j++) { for (int i = 0; i < 32 && leftSize > 0; i++, leftSize-=128) { int writeSlot = zMap->Find(); int writeSize = 128; if (leftSize < 128) writeSize = leftSize; thirdAddrs[i] = writeSlot; synchDisk->s_WriteDataInSector(writeSlot, 0, writeSize, tmp); tmp += writeSize; }//for (int i...) int midSlot = zMap->Find(); thirdSecMidAddrs[j] = midSlot; synchDisk->s_WriteDataInSector(midSlot, 0, 128, (char*)thirdAddrs); }//for (int j...) int secMidSlot = zMap->Find(); thirdFirstMidAddrs[k] = secMidSlot; synchDisk->s_WriteDataInSector(secMidSlot, 0, 128, (char*)thirdSecMidAddrs); }//for (int k...) int thirdAddr = zMap->Find(); s_dataSectors[5] = thirdAddr; synchDisk->s_WriteDataInSector(thirdAddr, 0, 128, (char*)thirdFirstMidAddrs); if (leftSize > 0) third = 1; }//end if (second == 1) else { int thirdFirstMidAddrs[32]; synchDisk->s_ReadDataInSector(s_dataSectors[5], 0, 128, (char*)thirdFirstMidAddrs); int lastFirstMid = (leftSize / 128 - maxSecond) / 32 / 32; for (int k = lastFirstMid; k < 32 && leftSize > 0; k++) { int thirdAddrs[32]; int thirdSecMidAddrs[32]; synchDisk->s_ReadDataInSector(thirdFirstMidAddrs[k], 0, 128, (char*)thirdSecMidAddrs); int lastSecMid = (leftSize / 128 - maxSecond) / 32 % 32; for (int j = lastSecMid; j < 32 && leftSize > 0; j++) { synchDisk->s_ReadDataInSector(thirdSecMidAddrs[lastSecMid], 0, 128, (char*)thirdAddrs); int lastOffsetSlot = (leftSize / 128 - maxSecond) % 32; if (lastOffset != 0 && j == lastSecMid) { int leftInOneSlot = 128 - lastOffset; int writeSector = thirdAddrs[lastOffsetSlot]; synchDisk->s_WriteDataInSector(writeSector, lastOffset, leftInOneSlot, tmp); tmp += leftInOneSlot; leftSize -= leftInOneSlot; lastOffsetSlot += 1; }//end if (lastOffset!=0) for (int i = 0; i < 32 && leftSize > 0; i++, leftSize-=128) { int writeSlot = zMap->Find(); int writeSize = 128; if (leftSize < 128) writeSize = leftSize; thirdAddrs[i] = writeSlot; synchDisk->s_WriteDataInSector(writeSlot, 0, writeSize, tmp); tmp += writeSize; }//end for (int i int midSlot = zMap->Find(); thirdSecMidAddrs[j] = midSlot; synchDisk->s_WriteDataInSector(midSlot, 0, 128, (char*)thirdAddrs); }//end for (int j...) int secMidSlot = zMap->Find(); thirdFirstMidAddrs[k] = secMidSlot; synchDisk->s_WriteDataInSector(secMidSlot, 0, 128, (char*)thirdSecMidAddrs); }//end for (int k...) synchDisk->s_WriteDataInSector(s_dataSectors[5], 0, 128, (char*)thirdFirstMidAddrs); }//end if (second == 1) else }//end if (third==1) numBytes += size;}//////////////////////////////////////////////////////// Function name : FileHeader::s_DeAllocate// Creator : Fang Wenbin(0410706)// CreateTime : 2007-1-9 21:45:04//// Function Desc : deallocate the blocks file covers// The steps of FileHeader::s_DeAllocate//// Fails if://// Note :// Return type : void // Argument : s_Bitmap *zMap//////////////////////////////////////////////////////void FileHeader::s_DeAllocate(s_Bitmap *zMap){ char direct = 0; char first = 0; char second = 0; char third = 0; int lastSlot = numBytes / 128; int lastOffset = numBytes % 128; int maxDirect = 3; int maxFirst = maxDirect + 32; int maxSecond = maxFirst + 32*32; int maxThird = maxSecond + 32*32*32; if (lastSlot < maxDirect) direct = 1; else if (lastSlot < maxFirst) direct = first = 1; else if (lastSlot < maxSecond) direct = first = second = 1; else if (lastSlot < maxThird) direct = first = second = third = 1; else ; int leftSize = numBytes;//////direct index/// if (direct == 1) { for (int i = 0; i < 3 && leftSize > 0; i++, leftSize -= 128) { zMap->Clear(s_dataSectors[i]); }//end for (int i...) }//end if (direct == 1)//////first indirect index/// if (first == 1) { int firstAddrs[32]; synchDisk->s_ReadDataInSector(s_dataSectors[3], 0, 128, (char*)firstAddrs); for (int j = 0; j < 32 && leftSize > 0; j++, leftSize -= 128) { int slot = firstAddrs[j]; zMap->Clear(slot); }//end for (int j...) zMap->Clear(s_dataSectors[3]); }//end if (first==1)//////second indirect index/// if (second == 1) { int secondAddrs[32]; int secondMidAddrs[32]; synchDisk->ReadSector(s_dataSectors[4], (char*)secondMidAddrs); for (int j = 0; j < 32 && leftSize > 0; j++) { synchDisk->ReadSector(secondMidAddrs[j], (char*)secondAddrs); for (int i = 0; i < 32 && leftSize > 0; i++, leftSize-=128) { zMap->Clear(secondAddrs[i]); }//end for (int i...) zMap->Clear(secondMidAddrs[j]); }//end for (int j...) zMap->Clear(s_dataSectors[4]); }//end if (second==1)//////third indirect index/// if (third == 1) { int thirdAddrs[32]; int thirdFirstMidAddrs[32]; int thirdSecondMidAddrs[32]; synchDisk->ReadSector(s_dataSectors[5], (char*)thirdFirstMidAddrs); for (int k = 0; k < 32 && leftSize > 0; k++) { synchDisk->ReadSector(thirdFirstMidAddrs[k], (char*)thirdSecondMidAddrs); for (int j = 0; j < 32 && leftSize > 0; j++) { synchDisk->ReadSector(thirdSecondMidAddrs[j], (char*)thirdAddrs); for (int i = 0; i < 32 && leftSize > 0; i++, leftSize-=128) { zMap->Clear(thirdAddrs[i]); }//end for (int i...) zMap->Clear(thirdSecondMidAddrs[j]); }//end for (int j...) zMap->Clear(thirdFirstMidAddrs[k]); }//end for (int k...) zMap->Clear(s_dataSectors[5]); }//if (third==1)}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?