重置上传,新增了多个标准库,开始 TransPyV 自举实验
This commit is contained in:
@@ -84,7 +84,7 @@ class MemManager:
|
||||
string.memset(ptr, 0, total)
|
||||
return ptr
|
||||
|
||||
def realloc(self, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr:
|
||||
def realloc(self, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr:
|
||||
if ptr is None:
|
||||
return self.alloc(new_size)
|
||||
if new_size == 0:
|
||||
@@ -93,10 +93,7 @@ class MemManager:
|
||||
new_ptr: t.CVoid | t.CPtr = self.alloc(new_size)
|
||||
if new_ptr is None:
|
||||
return ptr
|
||||
copy_size: t.CSizeT = old_size
|
||||
if new_size < old_size:
|
||||
copy_size = new_size
|
||||
string.memcpy(new_ptr, ptr, copy_size)
|
||||
# 基类无法追踪旧分配大小, 不复制数据; 子类可覆盖以保留数据
|
||||
self.free(ptr)
|
||||
return new_ptr
|
||||
|
||||
@@ -453,7 +450,7 @@ class MemBuddy(MemManager):
|
||||
return 1
|
||||
|
||||
# realloc 覆盖: 伙伴系统从块头读取旧阶数, 无需 old_size
|
||||
def realloc(self, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr:
|
||||
def realloc(self, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr:
|
||||
if ptr is None:
|
||||
return self.alloc(new_size)
|
||||
if new_size == 0:
|
||||
@@ -477,3 +474,48 @@ class MemBuddy(MemManager):
|
||||
string.memcpy(new_ptr, ptr, old_data_size)
|
||||
self.free(ptr)
|
||||
return new_ptr
|
||||
|
||||
# === 状态查询 ===
|
||||
|
||||
@property
|
||||
def mem_size(self) -> t.CSizeT:
|
||||
# 可用区总大小(2 的幂),分配上限为 mem_size - MEMBUDDY_HEADER_SIZE
|
||||
return self.usable_size
|
||||
|
||||
def stats(self) -> t.CSizeT:
|
||||
# 返回可用区总大小,用于状态统计
|
||||
return self.usable_size
|
||||
|
||||
def free_count(self) -> t.CSizeT:
|
||||
# 统计所有阶数空闲链中的块总数
|
||||
count: 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 cur is not None:
|
||||
count += 1
|
||||
cur = t.CVoid(c.Deref(t.CUInt64T(cur, t.CPtr)), t.CPtr)
|
||||
return count
|
||||
|
||||
def self_check(self) -> t.CInt:
|
||||
# 验证伙伴分配器内部一致性,返回 0=OK,非 0=损坏
|
||||
if self.usable is None:
|
||||
return 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 cur is not None:
|
||||
# 检查指针在可用区内
|
||||
if t.CUInt64T(cur) < t.CUInt64T(self.usable):
|
||||
return 1
|
||||
if t.CUInt64T(cur) >= t.CUInt64T(self.usable) + self.usable_size:
|
||||
return 2
|
||||
# 检查对齐:order i 的块必须按 _block_size_at_order(i) 对齐
|
||||
offset: t.CSizeT = t.CUInt64T(cur) - t.CUInt64T(self.usable)
|
||||
bs: t.CSizeT = _block_size_at_order(i)
|
||||
if offset % bs != 0:
|
||||
return 3
|
||||
cur = t.CVoid(c.Deref(t.CUInt64T(cur, t.CPtr)), t.CPtr)
|
||||
return 0
|
||||
|
||||
Reference in New Issue
Block a user