2009-12-08 00:01:24 +00:00
|
|
|
#ifndef __BLOCKCACHE_H__
|
|
|
|
#define __BLOCKCACHE_H__
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <vector>
|
2011-02-22 02:59:33 +00:00
|
|
|
#include <Device/Device.h>
|
|
|
|
|
2009-12-08 00:01:24 +00:00
|
|
|
|
2010-03-19 18:12:22 +00:00
|
|
|
class MappedFile;
|
|
|
|
|
2009-12-16 01:33:28 +00:00
|
|
|
namespace Device {
|
2009-12-08 00:01:24 +00:00
|
|
|
|
|
|
|
|
2010-03-22 00:32:27 +00:00
|
|
|
enum BlockReleaseFlags {
|
2010-03-19 18:12:22 +00:00
|
|
|
kBlockDirty = 1,
|
|
|
|
kBlockCommitNow = 2,
|
|
|
|
kBlockReuse = 3
|
2010-05-19 01:07:47 +00:00
|
|
|
};
|
2010-03-19 18:12:22 +00:00
|
|
|
|
2010-03-13 18:51:00 +00:00
|
|
|
class BlockCache {
|
2009-12-11 00:59:53 +00:00
|
|
|
public:
|
2010-03-13 18:51:00 +00:00
|
|
|
|
2011-02-22 02:59:33 +00:00
|
|
|
static BlockCachePointer Create(BlockDevicePointer device);
|
2010-03-13 18:51:00 +00:00
|
|
|
|
|
|
|
virtual ~BlockCache();
|
|
|
|
|
|
|
|
bool readOnly() { return _readOnly; }
|
|
|
|
unsigned blocks() { return _blocks; }
|
2011-02-22 02:59:33 +00:00
|
|
|
BlockDevicePointer device() { return _device; }
|
2009-12-11 00:59:53 +00:00
|
|
|
|
2010-03-13 18:51:00 +00:00
|
|
|
|
|
|
|
virtual void sync() = 0;
|
2010-03-13 19:24:00 +00:00
|
|
|
virtual void write(unsigned block, const void *bp);
|
|
|
|
virtual void read(unsigned block, void *bp);
|
2010-03-13 18:51:00 +00:00
|
|
|
|
|
|
|
virtual void *acquire(unsigned block) = 0;
|
2010-03-19 18:12:22 +00:00
|
|
|
virtual void release(unsigned block, int flags) = 0 ;
|
2010-03-13 18:51:00 +00:00
|
|
|
virtual void markDirty(unsigned block) = 0;
|
2009-12-11 00:59:53 +00:00
|
|
|
|
2010-05-20 22:30:00 +00:00
|
|
|
|
|
|
|
virtual void zeroBlock(unsigned block);
|
|
|
|
|
2010-03-19 18:12:22 +00:00
|
|
|
void release(unsigned block) { release(block, 0); }
|
2010-03-22 00:32:27 +00:00
|
|
|
void release(unsigned block, bool dirty)
|
2010-05-18 19:59:00 +00:00
|
|
|
{
|
|
|
|
release(block, dirty ? kBlockDirty : 0);
|
|
|
|
}
|
2010-03-13 18:51:00 +00:00
|
|
|
|
|
|
|
protected:
|
2011-02-22 02:59:33 +00:00
|
|
|
BlockCache(BlockDevicePointer device);
|
2010-03-13 18:51:00 +00:00
|
|
|
|
2011-02-22 02:59:33 +00:00
|
|
|
BlockDevicePointer _device;
|
2010-03-22 00:32:27 +00:00
|
|
|
|
|
|
|
private:
|
2010-03-13 18:51:00 +00:00
|
|
|
unsigned _blocks;
|
|
|
|
bool _readOnly;
|
2009-12-11 00:59:53 +00:00
|
|
|
};
|
|
|
|
|
2011-02-22 02:59:33 +00:00
|
|
|
|
2009-12-11 00:59:53 +00:00
|
|
|
} // namespace
|
2009-12-08 00:01:24 +00:00
|
|
|
|
2010-03-19 18:12:22 +00:00
|
|
|
#endif
|