相对稳定版本
This commit is contained in:
1 parent
a39b5da0f8
commit
2071486168
6310 files changed
+99310
-37
No files matched your search
@@ -48,7 +48,7 @@ from .match import (
|
||||
MatchCase, MatchValue, MatchSingleton, MatchSequence,
|
||||
MatchMapping, MatchClass, MatchStar, MatchAs, MatchOr,
|
||||
)
|
||||
from .visitor import ASTVisitor
|
||||
# from .visitor import ASTVisitor
|
||||
from .lexer import Lexer, _lexer_init, tokenize, new_lexer
|
||||
from .parser import Parser, _parser_init, parse_tokens, new_parser
|
||||
from .parser import _parse_test
|
||||
|
||||
+17
-22
@@ -527,29 +527,24 @@ class MemBuddy(MemManager):
|
||||
def alloc(self, size: t.CSizeT) -> t.CVoid | t.CPtr:
|
||||
self._lock()
|
||||
result: t.CVoid | t.CPtr = None
|
||||
if self.usable is not None:
|
||||
if size != 0:
|
||||
needed: t.CSizeT = size + MEMBUDDY_HEADER_SIZE
|
||||
order: t.CInt = self._order_for_size(needed)
|
||||
if order <= self.max_order:
|
||||
block: t.CVoid | t.CPtr = self._split_to_order(order)
|
||||
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)
|
||||
# 记录到 checkpoint 栈(供 reset_to 回收)
|
||||
if self.chk_stack is not None and self.chk_depth < self.chk_cap:
|
||||
self.chk_stack[self.chk_depth] = t.CUInt64T(block)
|
||||
self.chk_depth += 1
|
||||
if size != 0 and self.usable is not None:
|
||||
needed: t.CSizeT = size + MEMBUDDY_HEADER_SIZE
|
||||
order: t.CInt = self._order_for_size(needed)
|
||||
if order <= self.max_order:
|
||||
block: t.CVoid | t.CPtr = self._split_to_order(order)
|
||||
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)
|
||||
# 记录到 checkpoint 栈(供 reset_to 回收)
|
||||
if self.chk_stack is not None and self.chk_depth < self.chk_cap:
|
||||
self.chk_stack[self.chk_depth] = t.CUInt64T(block)
|
||||
self.chk_depth += 1
|
||||
if result is None:
|
||||
# Allocation failure: print memory usage statistics and exit with OOM
|
||||
fb: t.CSizeT = self.free_bytes()
|
||||
ub: t.CSizeT = self.usable_size - fb
|
||||
stdio.printf("\n[OOM] 内存不足 (Out of Memory)\n")
|
||||
stdio.printf("[OOM] 尝试分配: %zu 字节,失败\n", size)
|
||||
stdio.printf("[OOM] 内存池: total=%zu used=%zu free=%zu free_blocks=%zu\n",
|
||||
self.usable_size, ub, fb, self.free_count())
|
||||
stdio.printf("[OOM] 说明: 内存池已耗尽。可能原因: (1) 池大小不足,需增大 POOL_SIZE; (2) 存在内存泄漏。\n")
|
||||
stdlib.exit(1)
|
||||
# 分配失败(alloc(0) 或池耗尽):解锁并返回 None,由调用者决定后续处理。
|
||||
# 不能 exit——测试依赖 alloc 失败返回 None 后继续 free+重试
|
||||
# (如 OOM section: 耗尽后 free 一块再 alloc 应成功)。
|
||||
self._unlock()
|
||||
return None
|
||||
self._unlock()
|
||||
return result
|
||||
|
||||
|
||||
Reference in new issue
Block a user