mirror of
https://github.com/ksherlock/profuse.git
synced 2024-06-02 10:41:30 +00:00
git-svn-id: https://profuse.googlecode.com/svn/branches/v2@208 aa027e90-d47c-11dd-86d7-074df07e0730
This commit is contained in:
parent
e1d01c5298
commit
035d802d70
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user