过期的提供商清单覆盖较新的 PTY 所有权¶
在进程退出之前启动的提供商清单可能在其后完成,并重新连接已退出的运行时记录。如果某个替代项已在相同 ID 下被接纳,旧响应还可能覆盖其实例、使其终端句柄失效,并清除其窗格绑定。
这是针对诸如 #19018 之类的过期终端所有权问题的独立源码级解释。该证明并未确立 #19768 或 #19831 的原因,也未测量其报告的内存增长。
复现¶
从已安装依赖的检出目录运行:
该脚本使用延迟的提供商响应运行实际的运行时清单、注册、派生和退出方法。它使用临时 Vitest 配置仅为基线反向 fix.patch,不改动检出文件,并删除其临时文件。它不启动任何应用,不枚举任何真实进程,也不安装任何内容。Node 子进程使用仓库中可移植的 runProcess 实现。
results.json 记录源哈希以及前后结果:修复前 16 个失败 / 6 个通过;修复后全部 22 个通过。
保留与所有权路径¶
refreshPtyWorktreeRecordsWithControllerInventory启动提供商请求,并捕获其代际和存活观察序列。- 在响应挂起期间,
onPtyExit记录一次物理退出。随后的registerPty或onPtySpawned可能接纳一个后继项,包括在请求开始时运行时中不存在的一项。 - 原始清单返回其较旧的行。此前,判定设置器的观察检查并未保护其余的行处理:句柄采纳仍然运行,并且
recordPtyWorktree写入connected: true和旧实例。
对于没有替代项的退出,因此记录可能处于已连接状态,而其判定仍表示 exited。稍后的空列表会跳过断开连接记录的清扫,同时图中仍保留一个叶节点。在后继项情况下,adoptControllerTerminalHandle 可能在写入旧实例之前使新句柄失效。新的正向清单可以恢复后继项的句柄和实例;但没有绑定证据时,它无法重建已清除的窗格坐标。
该证明直接验证这些变更。它不重建原生进程或无头终端模型。因此,它演示的是错误的所有权和潜在的保留记录,而不是量化的堆或原生进程泄漏。
修复与控制¶
已接纳的派生、注册和退出事件现在通过现有的提供商代际注册表使其提供商的待处理清单失效。现有的过期响应检查在句柄采纳、记录变更或构建权威活动 ID 结果之前运行。
响应被整体拒绝,因此过滤后的行不会成为缺失的虚假证据。针对特定工作区的读取最多使用其原始截止时间重试一次;另一次失效会产生未知结果。针对不同主机的查询仍然有效。聚合请求在请求期间提供商发生变化时保守地拒绝。这可能拒绝恰好包含新接纳进程的响应;随后的新请求仍然是权威的。
测试覆盖过期正向行、过期缺失、请求开始时未知的派生、无实例的注册、被忽略的前驱 EXIT、导出句柄保留、新发现与替换、本地/SSH 路由(包括包含空格、@ 和 : 的 SSH 别名)、并发提供商代际,以及有界重试。现有的部分中继和存活测试验证失败联系不会被提升为进程死亡。该变更不添加永久每 PTY 注册表,也不更改任何线上字段或存活术语。
版本与范围¶
相关的 await、受保护的判定更新、无条件的句柄/记录更新,以及派生/注册判定删除存在于 v1.4.198。该版本在正向清单行上忘记了先前判定;当前代码记录 live。两个版本都将后续变更留在那次观察围栏之外。可执行基线是当前源码反向小范围修复后的结果,而不是历史应用二进制文件。
图发布围栏是另一个修复。后续的失联写入以及直接查询提供商清单的独立路径仍在此补丁之外。事件频率和报告机器的实际顺序未得到证明。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca