git-svn-id: https://profuse.googlecode.com/svn/branches/v2@208 aa027e90-d47c-11dd-86d7-074df07e0730

This commit is contained in:
ksherlock 2010-03-22 00:32:27 +00:00
parent e1d01c5298
commit 035d802d70
3 changed files with 20 additions and 66 deletions

View File

@ -5,13 +5,12 @@
#include <vector>
class MappedFile;
class Device::BlockDevice;
namespace Device {
class BlockDevice;
enum {
enum BlockReleaseFlags {
kBlockDirty = 1,
kBlockCommitNow = 2,
kBlockReuse = 3
@ -38,72 +37,20 @@ public:
virtual void markDirty(unsigned block) = 0;
void release(unsigned block) { release(block, 0); }
void release(unsigned block, bool dirty) { release(block, dirty ? kBlockDirty : 0); }
void release(unsigned block, bool dirty)
{ release(block, dirty ? kBlockDirty : 0); }
protected:
BlockCache(BlockDevice *device);
BlockDevice *_device;
private
private:
unsigned _blocks;
bool _readOnly;
};
class ConcreteBlockCache : public BlockCache {
public:
ConcreteBlockCache(BlockDevice *device, unsigned size = 16);
virtual ~ConcreteBlockCache();
virtual void sync();
virtual void write(unsigned block, const void *vp) = 0;
virtual void *acquire(unsigned block);
virtual void release(unsigned block, int flags);
virtual void markDirty(unsigned block);
private:
struct Entry {
unsigned block;
unsigned count;
bool dirty;
struct Entry *next;
struct Entry *prev;
struct Entry *nextHash;
uint8_t buffer[512];
};
enum { HashTableSize = 23 };
std::vector<Entry *>_buffers;
Entry *_hashTable[HashTableSize];
Entry *_first;
Entry *_last;
unsigned hashFunction(unsigned block);
Entry *findEntry(unsigned block);
void removeEntry(unsigned block);
void addEntry(Entry *);
Entry *newEntry(unsigned block);
void pushEntry(Entry *);
void setLast(Entry *);
incrementCount(Entry *);
decrementCount(Entry *);
};
} // namespace
#endif

View File

@ -7,6 +7,8 @@
#include <unistd.h>
#include <Cache/MappedBlockCache.h>
#include <Device/BlockDevice.h>
#include <ProFUSE/Exception.h>
@ -17,7 +19,7 @@ using ProFUSE::Exception;
using ProFUSE::POSIXException;
MappedBlockCache::MappedBlockCache(Device *device, void *data) :
MappedBlockCache::MappedBlockCache(BlockDevice *device, void *data) :
BlockCache(device)
{
_data = (uint8_t *)data;
@ -42,7 +44,7 @@ void *MappedBlockCache::acquire(unsigned block)
return _data + block * 512;
}
void MappedBlockCache::unload(unsigned block, int flags)
void MappedBlockCache::release(unsigned block, int flags)
{
#undef __METHOD__
#define __METHOD__ "MappedBlockCache::unload"
@ -50,7 +52,7 @@ void MappedBlockCache::unload(unsigned block, int flags)
// kBlockCommitNow implies kBlockDirty.
if (flags & kBlockCommitNow)
{
sync(block)
sync(block);
return;
}
@ -75,10 +77,14 @@ void MappedBlockCache::sync(unsigned block)
#define __METHOD__ "MappedBlockCache::sync"
int pageSize = ::getpagesize();
int pagesize = ::getpagesize();
void *start = (_data + block * 512) % pagesize;
void *end = (_data + 512 + block * 512) % pagesize;
void *start = _data + block * 512;
void *end = _data + 512 + block * 512;
start = (void *)((ptrdiff_t)start / pagesize * pagesize);
end = (void *)((ptrdiff_t)end / pagesize * pagesize);
if (::msync(start, pagesize, MS_SYNC) != 0)
throw POSIXException(__METHOD__ ": msync", errno);

View File

@ -20,7 +20,7 @@ class MappedBlockCache : public BlockCache {
virtual void markDirty(unsigned block);
private:
void sync(block);
void sync(unsigned block);
uint8_t *_data;
bool _dirty;
@ -29,4 +29,5 @@ class MappedBlockCache : public BlockCache {
} // namespace
#endif