本文整理汇总了C++中Directory::SetSize方法的典型用法代码示例。如果您正苦于以下问题:C++ Directory::SetSize方法的具体用法?C++ Directory::SetSize怎么用?C++ Directory::SetSize使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Directory
的用法示例。
在下文中一共展示了Directory::SetSize方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: allocatedBlock
status_t
DirEntryTree::_InsertEntryIncrementDepth(LevelInfo* infos,
Transaction& transaction)
{
FUNCTION("depth: %u -> %u\n", _Depth(), _Depth() + 1);
if (_Depth() >= kCheckSumFSMaxDirEntryTreeDepth)
RETURN_ERROR(B_DEVICE_FULL);
// allocate a new block
AllocatedBlock allocatedBlock(
fDirectory->GetVolume()->GetBlockAllocator(), transaction);
status_t error = allocatedBlock.Allocate(fDirectory->BlockIndex());
if (error != B_OK)
RETURN_ERROR(error);
fDirectory->SetSize(fDirectory->Size() + B_PAGE_SIZE);
LevelInfo& newInfo = infos[1];
if (!newInfo.block.GetZero(fDirectory->GetVolume(),
allocatedBlock.Index(), transaction)) {
RETURN_ERROR(B_ERROR);
}
allocatedBlock.Detach();
newInfo.entryBlock.SetTo(
(checksumfs_dir_entry_block*)newInfo.block.Data(), B_PAGE_SIZE);
ASSERT(newInfo.entryBlock.Check());
// move the old root block contents to the new block
LevelInfo& rootInfo = infos[0];
rootInfo.entryBlock.SplitBlock(0, newInfo.entryBlock);
// add an entry for the new block to the root block
size_t nameLength;
const char* name = newInfo.entryBlock.NameAt(0, nameLength);
rootInfo.entryBlock.InsertEntry(0, name, nameLength,
newInfo.block.Index());
PRINT(" -> new block: %" B_PRIu64 "\n", newInfo.block.Index());
newInfo.index = rootInfo.index;
rootInfo.index = 0;
fTree->depth++;
return B_OK;
}
示例2: _UpdateOrInsertKey
//.........这里部分代码省略.........
info.exactMatch);
PRINT(" level %" B_PRId32 ", block %" B_PRIu64 " -> index: %" B_PRId32
" %sexact\n", level,
level == 0 ? fDirectory->BlockIndex() : info.block.Index(),
info.index, info.exactMatch ? "" : " not ");
if (level == depth) {
// final level -- here the entry should be found
if (!info.exactMatch)
RETURN_ERROR(B_ENTRY_NOT_FOUND);
break;
}
// If we haven't found an exact match, the index points to the first
// entry that is greater or after the last entry.
if (!info.exactMatch) {
if (info.index == 0) {
// The first entry is already greater, so the branch doesn't
// contain the entry we're looking for.
RETURN_ERROR(B_ENTRY_NOT_FOUND);
}
info.index--;
}
uint64 nextBlockIndex = info.entryBlock.BlockIndexAt(info.index);
// not the final level -- load the block and descend to the next
// level
LevelInfo& nextInfo = infos[level + 1];
if (!nextInfo.block.GetReadable(fDirectory->GetVolume(),
nextBlockIndex)) {
RETURN_ERROR(B_ERROR);
}
nextInfo.entryBlock.SetTo(
(checksumfs_dir_entry_block*)nextInfo.block.Data(),
B_PAGE_SIZE);
ASSERT(nextInfo.entryBlock.Check());
}
// We've found the entry. Insert the key and iterate backwards to perform
// the potentially necessary updates. Removal at index 0 of the block
// changes the block's key, requiring an update in the parent block.
// Removal of the last entry will require removal of the block from its
// parent. Key update can cause the block to be split (if there's not
// enough space left in it), requiring an insertion in the parent block.
// We start with a pending removal in the leaf block and work our way
// upwards as long as the blocks become empty. As soon as a key update is
// required, we delegate the remaining to the update/insert backwards loop.
for (int32 level = depth; level >= 0; level--) {
LevelInfo& info = infos[level];
// make the block writable
if (level > 0) {
error = info.block.MakeWritable(transaction);
if (error != B_OK)
RETURN_ERROR(error);
}
PRINT(" level: %" B_PRId32 ", index: %" B_PRId32 ": removing key "
"\"%.*s\" (%" B_PRIuSIZE ")\n", level, info.index, (int)nameLength,
name, nameLength);
if (info.entryBlock.EntryCount() == 1) {
// That's the last key in the block. Unless that's the root level,
// we remove the block completely.
PRINT(" -> block is empty\n");
if (level == 0) {
info.entryBlock.RemoveEntry(info.index);
return B_OK;
}
error = fDirectory->GetVolume()->GetBlockAllocator()->Free(
info.block.Index(), 1, transaction);
if (error != B_OK)
RETURN_ERROR(error);
fDirectory->SetSize(fDirectory->Size() - B_PAGE_SIZE);
// remove the key (the same one) from the parent block
continue;
}
// There are more entries, so just remove the entry in question. If it
// is not the first one, we're done, otherwise we have to update the
// block's key in the parent block.
info.entryBlock.RemoveEntry(info.index);
if (info.index > 0 || level == 0)
return B_OK;
name = info.entryBlock.NameAt(0, nameLength);
return _UpdateOrInsertKey(infos, level - 1, name, nameLength, 0, false,
transaction);
}
return B_OK;
}