Added a bit more tracing output to the block allocations.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23496 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -77,6 +77,53 @@ class Free : public AbstractTraceEntry {
|
|||||||
block_run fRun;
|
block_run fRun;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static uint32
|
||||||
|
checksum(const uint8 *data, size_t size)
|
||||||
|
{
|
||||||
|
const uint32 *data4 = (const uint32 *)data;
|
||||||
|
uint32 sum = 0;
|
||||||
|
while (size >= 4) {
|
||||||
|
sum += *data4;
|
||||||
|
data4++;
|
||||||
|
size -= 4;
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Block : public AbstractTraceEntry {
|
||||||
|
public:
|
||||||
|
Block(const char *label, off_t blockNumber, const uint8 *data,
|
||||||
|
size_t size)
|
||||||
|
:
|
||||||
|
fBlock(blockNumber),
|
||||||
|
fData(data)
|
||||||
|
{
|
||||||
|
strlcpy(fLabel, label, sizeof(fLabel));
|
||||||
|
fSum = checksum(data, size);
|
||||||
|
memcpy(fBytes, data, min_c(size, sizeof(fBytes)));
|
||||||
|
Initialized();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void AddDump(char *buffer, size_t size)
|
||||||
|
{
|
||||||
|
uint32 length = snprintf(buffer, size, "%s: block %Ld (%p), sum %lu,"
|
||||||
|
" bytes ", fLabel, fBlock, fData, fSum);
|
||||||
|
for (uint32 i = 0; length < size - 1 && i < sizeof(fBytes); i++) {
|
||||||
|
length += snprintf(buffer + length, size - length, "%02x",
|
||||||
|
fBytes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
off_t fBlock;
|
||||||
|
const uint8 *fData;
|
||||||
|
uint32 fSum;
|
||||||
|
char fLabel[12];
|
||||||
|
uint8 fBytes[32];
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace BFSBlockTracing
|
} // namespace BFSBlockTracing
|
||||||
|
|
||||||
# define T(x) new(std::nothrow) BFSBlockTracing::x;
|
# define T(x) new(std::nothrow) BFSBlockTracing::x;
|
||||||
@@ -109,6 +156,7 @@ class AllocationBlock : public CachedBlock {
|
|||||||
|
|
||||||
uint32 NumBlockBits() const { return fNumBits; }
|
uint32 NumBlockBits() const { return fNumBits; }
|
||||||
uint32 &Block(int32 index) { return ((uint32 *)fBlock)[index]; }
|
uint32 &Block(int32 index) { return ((uint32 *)fBlock)[index]; }
|
||||||
|
uint8 *Block() const { return (uint8 *)fBlock; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint32 fNumBits;
|
uint32 fNumBits;
|
||||||
@@ -375,6 +423,7 @@ AllocationGroup::Free(Transaction &transaction, uint16 start, int32 length)
|
|||||||
if (cached.SetToWritable(transaction, *this, block) < B_OK)
|
if (cached.SetToWritable(transaction, *this, block) < B_OK)
|
||||||
RETURN_ERROR(B_IO_ERROR);
|
RETURN_ERROR(B_IO_ERROR);
|
||||||
|
|
||||||
|
T(Block("free-1", block, cached.Block(), volume->BlockSize()));
|
||||||
uint16 freeLength = length;
|
uint16 freeLength = length;
|
||||||
if (uint32(start + length) > cached.NumBlockBits())
|
if (uint32(start + length) > cached.NumBlockBits())
|
||||||
freeLength = cached.NumBlockBits() - start;
|
freeLength = cached.NumBlockBits() - start;
|
||||||
@@ -383,6 +432,7 @@ AllocationGroup::Free(Transaction &transaction, uint16 start, int32 length)
|
|||||||
|
|
||||||
length -= freeLength;
|
length -= freeLength;
|
||||||
start = 0;
|
start = 0;
|
||||||
|
T(Block("free-2", block, cached.Block(), volume->BlockSize()));
|
||||||
block++;
|
block++;
|
||||||
}
|
}
|
||||||
return B_OK;
|
return B_OK;
|
||||||
@@ -632,6 +682,8 @@ BlockAllocator::AllocateBlocks(Transaction &transaction, int32 group,
|
|||||||
if (cached.SetTo(fGroups[group], block) < B_OK)
|
if (cached.SetTo(fGroups[group], block) < B_OK)
|
||||||
RETURN_ERROR(B_ERROR);
|
RETURN_ERROR(B_ERROR);
|
||||||
|
|
||||||
|
T(Block("alloc-in", block, cached.Block(), fVolume->BlockSize()));
|
||||||
|
|
||||||
// find a block large enough to hold the allocation
|
// find a block large enough to hold the allocation
|
||||||
for (uint32 bit = start % cached.NumBlockBits();
|
for (uint32 bit = start % cached.NumBlockBits();
|
||||||
bit < cached.NumBlockBits(); bit++) {
|
bit < cached.NumBlockBits(); bit++) {
|
||||||
@@ -680,6 +732,8 @@ BlockAllocator::AllocateBlocks(Transaction &transaction, int32 group,
|
|||||||
// fixed anyway.
|
// fixed anyway.
|
||||||
|
|
||||||
T(Allocate(run));
|
T(Allocate(run));
|
||||||
|
T(Block("alloc-out", block, cached.Block(),
|
||||||
|
fVolume->BlockSize()));
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user