修正了一些错误
This commit is contained in:
@@ -429,6 +429,13 @@ class MemBuddy(MemManager):
|
||||
if block is not None:
|
||||
c.DerefAs(block, t.CVoid(t.CUInt64T((order << 1) | 1), t.CPtr))
|
||||
result = t.CVoid(t.CUInt64T(block) + MEMBUDDY_HEADER_SIZE, t.CPtr)
|
||||
if result is None:
|
||||
# 分配失败: 打印内存使用情况
|
||||
fb: t.CSizeT = self.free_bytes()
|
||||
ub: t.CSizeT = self.usable_size - fb
|
||||
stdio.printf("[MEM-FAIL] alloc(%zu) failed: total=%zu used=%zu free=%zu free_blocks=%zu\n",
|
||||
size, self.usable_size, ub, fb, self.free_count())
|
||||
stdio.fflush(0)
|
||||
self._unlock()
|
||||
return result
|
||||
|
||||
@@ -503,6 +510,32 @@ class MemBuddy(MemManager):
|
||||
cur = t.CVoid(c.Deref(t.CUInt64T(cur, t.CPtr)), t.CPtr)
|
||||
return count
|
||||
|
||||
def free_bytes(self) -> t.CSizeT:
|
||||
# 统计所有空闲块的总字节数
|
||||
total: t.CSizeT = 0
|
||||
i: t.CInt
|
||||
for i in range(MEMBUDDY_MAX_ORDERS + 1):
|
||||
head_val: t.CUInt64T = self.free_lists[i]
|
||||
cur: t.CVoid | t.CPtr = t.CVoid(head_val, t.CPtr)
|
||||
while t.CUInt64T(cur) != 0:
|
||||
total += _block_size_at_order(i)
|
||||
cur = t.CVoid(c.Deref(t.CUInt64T(cur, t.CPtr)), t.CPtr)
|
||||
return total
|
||||
|
||||
def used_bytes(self) -> t.CSizeT:
|
||||
# 已使用字节数 = 可用区总大小 - 空闲字节数
|
||||
return self.usable_size - self.free_bytes()
|
||||
|
||||
def dump_stats(self, label: t.CChar | t.CPtr):
|
||||
# 打印内存使用统计
|
||||
fb: t.CSizeT = self.free_bytes()
|
||||
ub: t.CSizeT = self.usable_size - fb
|
||||
stdio.printf("[MEM] %s: total=%zu used=%zu (%zu%%) free=%zu free_blocks=%zu\n",
|
||||
label, self.usable_size, ub,
|
||||
(ub * 100) / self.usable_size if self.usable_size > 0 else 0,
|
||||
fb, self.free_count())
|
||||
stdio.fflush(0)
|
||||
|
||||
def self_check(self) -> t.CInt:
|
||||
# 验证伙伴分配器内部一致性,返回 0=OK,非 0=损坏
|
||||
if self.usable is None:
|
||||
|
||||
Reference in New Issue
Block a user