Proper fragmentation handling

This commit is contained in:
Phillip Stephens 2016-06-26 10:34:45 -07:00
parent fe835efd71
commit aa36b77af6
2 changed files with 16 additions and 18 deletions

View File

@ -4,7 +4,6 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include <memory> #include <memory>
#include "Util.hpp" #include "Util.hpp"
namespace kabufuda namespace kabufuda

View File

@ -248,13 +248,13 @@ void Card::commit()
*m_previousDir = updateDir; *m_previousDir = updateDir;
if (m_previousDir == &m_dir) if (m_previousDir == &m_dir)
{ {
m_currentDir = &m_dir; m_currentDir = &m_dir;
m_previousDir = &m_dirBackup; m_previousDir = &m_dirBackup;
} }
else else
{ {
m_currentDir = &m_dirBackup; m_currentDir = &m_dirBackup;
m_previousDir = &m_dir; m_previousDir = &m_dir;
} }
BlockAllocationTable updateBat = *m_currentBat; BlockAllocationTable updateBat = *m_currentBat;
@ -263,13 +263,13 @@ void Card::commit()
*m_previousBat = updateBat; *m_previousBat = updateBat;
if (m_previousBat == &m_bat) if (m_previousBat == &m_bat)
{ {
m_currentBat = &m_bat; m_currentBat = &m_bat;
m_previousBat = &m_batBackup; m_previousBat = &m_batBackup;
} }
else else
{ {
m_currentBat = &m_batBackup; m_currentBat = &m_batBackup;
m_previousBat = &m_bat; m_previousBat = &m_bat;
} }
swapEndian(); swapEndian();
@ -351,12 +351,12 @@ uint16_t BlockAllocationTable::nextFreeBlock(uint16_t maxBlock, uint16_t startin
{ {
maxBlock = std::min(maxBlock, uint16_t(BATSize)); maxBlock = std::min(maxBlock, uint16_t(BATSize));
for (uint16_t i = startingBlock; i < maxBlock; ++i) for (uint16_t i = startingBlock; i < maxBlock; ++i)
if (m_map[i - FSTBlocks] == 0) if (m_map[i - FSTBlocks] == 0)
return i; return i;
for (uint16_t i = FSTBlocks; i < startingBlock; ++i) for (uint16_t i = FSTBlocks; i < startingBlock; ++i)
if (m_map[i - FSTBlocks] == 0) if (m_map[i - FSTBlocks] == 0)
return i; return i;
} }
return 0xFFFF; return 0xFFFF;
@ -393,12 +393,11 @@ uint16_t BlockAllocationTable::allocateBlocks(uint16_t count, uint16_t maxBlocks
uint16_t tmpCount = count; uint16_t tmpCount = count;
while ((count--) > 0) while ((count--) > 0)
{ {
if (count == 0) m_map[(freeBlock - FSTBlocks)] = 0xFFFF;
m_map[(freeBlock - FSTBlocks)] = 0xFFFF; if (count != 0)
else
{ {
m_map[(freeBlock - FSTBlocks)] = freeBlock + 1; m_map[(freeBlock - FSTBlocks)] = nextFreeBlock(maxBlocks - FSTBlocks, m_lastAllocated + 1);
freeBlock = nextFreeBlock(maxBlocks - FSTBlocks, m_lastAllocated + 1); freeBlock = m_map[(freeBlock - FSTBlocks)];
} }
m_lastAllocated = freeBlock; m_lastAllocated = freeBlock;
} }