[Horus] Attempt to fix the problem with some files after a massstorage session

This commit is contained in:
Bertrand Songis
2016-08-31 23:54:43 +02:00
parent 76f0b306aa
commit 4221bfdf74
3 changed files with 30 additions and 11 deletions
+15
View File
@@ -71,6 +71,11 @@ void DiskCacheBlock::free(DWORD sector, UINT count)
}
}
void DiskCacheBlock::free()
{
endSector = 0;
}
bool DiskCacheBlock::empty() const
{
return (endSector == 0);
@@ -84,6 +89,16 @@ DiskCache::DiskCache():
blocks = new DiskCacheBlock[DISK_CACHE_BLOCKS_NUM];
}
void DiskCache::clear()
{
lastBlock = 0;
stats.noHits = 0;
stats.noMisses = 0;
for (int n=0; n<DISK_CACHE_BLOCKS_NUM; ++n) {
blocks[n].free();
}
}
DRESULT DiskCache::read(BYTE drv, BYTE * buff, DWORD sector, UINT count)
{
// TODO: check if not caching first sectors would improve anything
+13 -11
View File
@@ -37,6 +37,7 @@ public:
bool read(BYTE* buff, DWORD sector, UINT count);
DRESULT fill(BYTE drv, BYTE* buff, DWORD sector, UINT count);
void free(DWORD sector, UINT count);
void free();
bool empty() const;
private:
@@ -53,17 +54,18 @@ struct DiskCacheStats
class DiskCache
{
public:
DiskCache();
DRESULT read(BYTE drv, BYTE* buff, DWORD sector, UINT count);
DRESULT write(BYTE drv, const BYTE* buff, DWORD sector, UINT count);
const DiskCacheStats & getStats() const;
int getHitRate() const;
private:
DiskCacheStats stats;
uint32_t lastBlock;
DiskCacheBlock * blocks;
public:
DiskCache();
DRESULT read(BYTE drv, BYTE* buff, DWORD sector, UINT count);
DRESULT write(BYTE drv, const BYTE* buff, DWORD sector, UINT count);
const DiskCacheStats & getStats() const;
int getHitRate() const;
void clear();
private:
DiskCacheStats stats;
uint32_t lastBlock;
DiskCacheBlock * blocks;
};
extern DiskCache diskCache;
+2
View File
@@ -308,6 +308,8 @@ void sdMount()
{
TRACE("sdMount");
diskCache.clear();
if (f_mount(&g_FATFS_Obj, "", 1) == FR_OK) {
// call sdGetFreeSectors() now because f_getfree() takes a long time first time it's called
sdGetFreeSectors();