uint64_t prev_len = 0;
unsigned n = 0;
while (!p.end()) {
- Extent *le = new Extent(onode->c->cache);
+ Extent *le = new Extent();
uint64_t blobid;
small_decode_varint(blobid, p);
if ((blobid & BLOBID_FLAG_CONTIGUOUS) == 0) {
le->blob_depth = 1;
}
if (blobid & BLOBID_FLAG_SPANNING) {
- le->blob = get_spanning_blob(blobid >> BLOBID_SHIFT_BITS);
+ le->assign_blob(get_spanning_blob(blobid >> BLOBID_SHIFT_BITS));
} else {
blobid >>= BLOBID_SHIFT_BITS;
if (blobid) {
- le->blob = blobs[blobid - 1];
+ le->assign_blob(blobs[blobid - 1]);
assert(le->blob);
} else {
- le->blob = new Blob();
+ le->assign_blob(new Blob());
le->blob->decode(p);
blobs[n] = le->blob;
onode->c->open_shared_blob(le->blob);
/// ctor for lookup only
explicit Extent(uint32_t lo) : logical_offset(lo) { }
/// ctor for delayed intitialization (see decode_some())
- explicit Extent(Cache *cache) {
- cache->add_extent();
+ explicit Extent() {
}
/// ctor for general usage
Extent(uint32_t lo, uint32_t o, uint32_t l, uint8_t bd, BlobRef& b)
- : logical_offset(lo), blob_offset(o), length(l), blob_depth(bd), blob(b) {
- if (blob) {
- blob->shared_blob->bc.cache->add_extent();
- }
+ : logical_offset(lo), blob_offset(o), length(l), blob_depth(bd) {
+ assign_blob(b);
}
~Extent() {
if (blob) {
}
}
+ void assign_blob(const BlobRef& b) {
+ assert(!blob);
+ blob = b;
+ blob->shared_blob->bc.cache->add_extent();
+ }
+
// comparators for intrusive_set
friend bool operator<(const Extent &a, const Extent &b) {
return a.logical_offset < b.logical_offset;