refactor(phase2): 句柄数组改回 list[t.CPtr]

TPC 已根修 list[t.CPtr] 特化(_resolve_generic_slice_type 保留 t.CPtr
带前缀 + mangled 名统一 'ptr'),不再需要 list[str] 绕开。句柄数组
方案保留:start() 后立即取 handle,join/close 直接对句柄操作。
This commit is contained in:
TermiNexus committed 2026-08-19 22:44:21 +08:00
1 parent 0810f9f9e8
commit 0faf44e179
1 file changed
+9 -9
+9 -9
View File
@@ -603,13 +603,15 @@ def run_llc_parallel(tasks: bytes, task_count: int, max_threads: int) -> int:
return 0
if max_threads <= 0:
max_threads = 1
# 线程句柄数组(list[t.CPtr] 8 字节指针存取稳定):插桩证实
# list[vthreading.Thread|t.CPtr] 的 get(0)/get(1) 返回同一对象指针
# (栈对象地址复用),且 j=0 的 close() 把 handle 置 NULL 后 j=1 的
# join 用 NULL 句柄 → WaitForSingleObject 立即 WAIT_FAILED → alive=0
# → e5fb 线程句柄从未被 join(失败槽 Result=-1)。改为 start() 后
# 立即取出 handle 值存入句柄数组,join/close 直接对句柄操作,
# 不再依赖 Thread 对象的存续。
# 线程句柄数组(list[t.CPtr] 8 字节指针存取稳定):插桩证实此前
# list[vthreading.Thread|t.CPtr] 的 get(0)/get(1) 返回同一槽(elem_size=0
# 根因已修:TPC _HandleSizeofLlvm 对联合类型 X|t.CPtr 返回 8),且
# j=0 的 close() 清空对象 handle 后 j=1 的 join 用 NULL 句柄 → 立即
# WAIT_FAILED。改为 start() 后立即取出 handle 值存入句柄数组,
# join/close 直接对句柄操作,不再依赖 Thread 对象的存续。
# 注:list[t.CPtr] 特化此前报 "Undefined method 'append'"(type_map 用裸
# CPtr 替换模板不可解析)已根修(TPC _resolve_generic_slice_type 保留
# t.CPtr 带前缀 + mangled 名统一 'ptr')。
handles: list[t.CPtr] | t.CPtr = list[t.CPtr](_mbuddy)
if handles is None:
VLogger.error("run_llc_parallel: 线程句柄数组分配失败", "PhaseB")
@@ -632,8 +634,6 @@ def run_llc_parallel(tasks: bytes, task_count: int, max_threads: int) -> int:
# join 时再读 self.handle 可能已被 close 清空/覆盖)
handles.append(th.handle)
j += 1
# 本批 join(直接对句柄操作,不依赖 Thread 对象;handles 跨批次
# 累积,全局索引 = batch_start + j)
j = 0
while j < batch_n:
h_j: t.CPtr = handles.get(batch_start + j)