break;
}
if (b->offset < offset) {
- uint64_t front = offset - b->offset;
+ int64_t front = offset - b->offset;
if (b->end() > end) {
// drop middle (split)
uint64_t tail = b->end() - end;
} else {
_add_buffer(new Buffer(this, b->state, b->seq, end, tail));
}
- assert(cache->buffer_size >= b->length - front);
- cache->buffer_size -= b->length - front;
+ cache->_adjust_buffer_size(b, front - (int64_t)b->length);
b->truncate(front);
cache->_audit_lru("discard end 1");
return;
} else {
// drop tail
- assert(cache->buffer_size >= b->length - front);
- cache->buffer_size -= b->length - front;
+ cache->_adjust_buffer_size(b, front - (int64_t)b->length);
b->truncate(front);
++i;
continue;
void _add_buffer(Buffer *b) {
cache->_audit_lru("_add_buffer start");
buffer_map[b->offset].reset(b);
- cache->buffer_lru.push_front(*b);
- cache->buffer_size += b->length;
+ cache->_add_buffer(b);
if (b->is_writing()) {
writing.push_back(*b);
}
}
void _rm_buffer(map<uint64_t,std::unique_ptr<Buffer>>::iterator p) {
cache->_audit_lru("_rm_buffer start");
- assert(cache->buffer_size >= p->second->length);
- cache->buffer_size -= p->second->length;
- cache->buffer_lru.erase(cache->buffer_lru.iterator_to(*p->second));
+ cache->_rm_buffer(p->second.get());
if (p->second->is_writing()) {
writing.erase(writing.iterator_to(*p->second));
}
Onode,
boost::intrusive::list_member_hook<>,
&Onode::lru_item> > onode_lru_list_t;
- onode_lru_list_t onode_lru;
-
- public:
typedef boost::intrusive::list<
Buffer,
boost::intrusive::member_hook<
boost::intrusive::list_member_hook<>,
&Buffer::lru_item> > buffer_lru_list_t;
- std::mutex lock; ///< protect lru and other structures
+ onode_lru_list_t onode_lru;
+
buffer_lru_list_t buffer_lru;
uint64_t buffer_size = 0;
+ public:
+
+ std::mutex lock; ///< protect lru and other structures
+
void _add_onode(OnodeRef& o) {
onode_lru.push_front(*o);
}
}
void _touch_onode(OnodeRef& o);
+ void _add_buffer(Buffer *b) {
+ buffer_lru.push_front(*b);
+ buffer_size += b->length;
+ }
+ void _rm_buffer(Buffer *b) {
+ assert(buffer_size >= b->length);
+ buffer_size -= b->length;
+ auto q = buffer_lru.iterator_to(*b);
+ buffer_lru.erase(q);
+ }
+ void _adjust_buffer_size(Buffer *b, int64_t delta) {
+ assert((int64_t)buffer_size + delta >= 0);
+ buffer_size += delta;
+ }
void _touch_buffer(Buffer *b) {
auto p = buffer_lru.iterator_to(*b);
buffer_lru.erase(p);