mirror of
https://github.com/ksherlock/profuse.git
synced 2024-06-04 08:29:32 +00:00
git-svn-id: https://profuse.googlecode.com/svn/branches/v2@206 aa027e90-d47c-11dd-86d7-074df07e0730
This commit is contained in:
parent
07f1244834
commit
82167f07f9
|
@ -8,7 +8,6 @@
|
||||||
|
|
||||||
#include <Cache/MappedBlockCache.h>
|
#include <Cache/MappedBlockCache.h>
|
||||||
#include <ProFUSE/Exception.h>
|
#include <ProFUSE/Exception.h>
|
||||||
#include <ProFUSE/auto.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,18 +47,51 @@ void MappedBlockCache::unload(unsigned block, int flags)
|
||||||
#undef __METHOD__
|
#undef __METHOD__
|
||||||
#define __METHOD__ "MappedBlockCache::unload"
|
#define __METHOD__ "MappedBlockCache::unload"
|
||||||
|
|
||||||
|
// kBlockCommitNow implies kBlockDirty.
|
||||||
if (flags & kBlockCommitNow)
|
if (flags & kBlockCommitNow)
|
||||||
{
|
{
|
||||||
_dirty = true;
|
sync(block)
|
||||||
sync();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & kBlockDirty) _dirty = true;
|
if (flags & kBlockDirty) _dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sync everything.
|
||||||
void MappedBlockCache::sync()
|
void MappedBlockCache::sync()
|
||||||
{
|
{
|
||||||
_device->sync();
|
_device->sync();
|
||||||
_dirty = false;
|
_dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* sync an individual page.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void MappedBlockCache::sync(unsigned block)
|
||||||
|
{
|
||||||
|
#undef __METHOD__
|
||||||
|
#define __METHOD__ "MappedBlockCache::sync"
|
||||||
|
|
||||||
|
|
||||||
|
int pageSize = ::getpagesize();
|
||||||
|
|
||||||
|
void *start = (_data + block * 512) % pagesize;
|
||||||
|
void *end = (_data + 512 + block * 512) % pagesize;
|
||||||
|
|
||||||
|
if (::msync(start, pagesize, MS_SYNC) != 0)
|
||||||
|
throw POSIXException(__METHOD__ ": msync", errno);
|
||||||
|
|
||||||
|
if (start != end)
|
||||||
|
{
|
||||||
|
if (::msync(end, pagesize, MS_SYNC) != 0)
|
||||||
|
throw POSIXException(__METHOD__ ": msync", errno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MappedBlockCache::markDirty(unsigned block)
|
||||||
|
{
|
||||||
|
_dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef __MAPPED_BLOCK_CACHE_H__
|
#ifndef __MAPPED_BLOCK_CACHE_H__
|
||||||
#define __MAPPED_BLOCK_CACHE_H__
|
#define __MAPPED_BLOCK_CACHE_H__
|
||||||
|
|
||||||
#include <BlockCache.h>
|
#include <Cache/BlockCache.h>
|
||||||
|
|
||||||
namespace Device {
|
namespace Device {
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ class MappedBlockCache : public BlockCache {
|
||||||
MappedBlockCache(BlockDevice *, void *data);
|
MappedBlockCache(BlockDevice *, void *data);
|
||||||
virtual ~MappedBlockCache();
|
virtual ~MappedBlockCache();
|
||||||
|
|
||||||
virtual void sync() = 0;
|
virtual void sync();
|
||||||
virtual void write(unsigned block, const void *vp);
|
virtual void write(unsigned block, const void *vp);
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,7 +20,9 @@ class MappedBlockCache : public BlockCache {
|
||||||
virtual void markDirty(unsigned block);
|
virtual void markDirty(unsigned block);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void *_data;
|
void sync(block);
|
||||||
|
|
||||||
|
uint8_t *_data;
|
||||||
bool _dirty;
|
bool _dirty;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user