diff --git a/Cache/BlockCache.h b/Cache/BlockCache.h index f740c32..d613cf0 100644 --- a/Cache/BlockCache.h +++ b/Cache/BlockCache.h @@ -5,13 +5,12 @@ #include 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_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 diff --git a/Cache/MappedBlockCache.cpp b/Cache/MappedBlockCache.cpp index 103f846..95df640 100644 --- a/Cache/MappedBlockCache.cpp +++ b/Cache/MappedBlockCache.cpp @@ -7,6 +7,8 @@ #include #include +#include + #include @@ -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); diff --git a/Cache/MappedBlockCache.h b/Cache/MappedBlockCache.h index c10a362..fac9504 100644 --- a/Cache/MappedBlockCache.h +++ b/Cache/MappedBlockCache.h @@ -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