Repository navigation
feat: DSG042 TUI 输入泵 stdin 原始流迁移 P1+P2(双通道开关渐进) - #465
Merged
Merged
Conversation
…KeyPump 收编现役+RawStdinPump 后台读线程全链,--raw-input 灰度开关,P3 实测后切默认退役 TryCollectPaste 状态机)而非裸切 | 原因: ReadKey 与原始流互斥全有或全无,现役 14 键位接线稳定不允许直切;KeyPressParser 解析器已完备仅缺生产接线 | 替代方案: 裸切原始流(无回退,Windows conhost 行为未实测);永久双轨(维护两套输入语义漂移)——均弃
P1 抽象收编(零语义变化): - IInputPump 接口(Drain(dispatch) 非阻塞排空 — KeyPress 形态两通道一致,分派链零改动) - ReadKeyPump:现役 DrainInput 逻辑整体搬入(ReadKey 归一 + bracketed paste 重组状态机 + 误撞塞回缓冲) - ReplShell 消费 _inputPump.Drain(构造注入默认 ReadKeyPump);五方法与 _pendingKeys 字段迁出 P2 RawStdinPump(完整 VT 链): - 后台读线程(IsBackground)阻塞读 Console.OpenStandardInput → UTF-8 增量解码(跨块多字节保留)→ KeyPressParser 逐键解析(不完整前缀攒齐;paste 整块直出 — 重组状态机天然不需要)→ 有界通道 256 - 线程模型:_gate 锁保护 pending+投递(读线程解析/Drain 续投双向触发);投递纯非阻塞(TryWrite 满即停 + span 回退防丢键)全链零同步等待 — 根除同线程 Feed+Drain 自死锁 - Drain 两轮续投(通道腾空后 pending 残留续投,至多两轮防活锁);EOF 不关通道(EOF 不等于 Dispose) - FeedForTest 注入面(解码/解析/通道/Drain 全链可测;真实 stdin 阻塞行为留宿主 exe 验收 ADR 0080) 用户点报的自死锁根因与修复: - 自死锁链:FeedForTest 同线程同步投递 + WriteAsync.GetAwaiter().GetResult() 满等待 + 消费者 Drain 在同线程后续 — 互等永不退出 - 修复:投递非阻塞化(TryWrite 失败回退 span 本键起点不消耗)+ DropWrite 改 Wait(DropWrite 满时静默吞键返回 true 与满即停语义相反 — 300 键收 256 丢 44 实证)+ 测试收集循环 2s 超时熔断(fail-fast 带诊断:已收数/pending 残留 — 两处真 bug 均由熔断诊断定位) 验证: RawStdinPumpTests 13/13(含三倍容量键风暴压力 + 熔断);全量 1721 四连全绿;Host 编译零警告
… Dispose(通道完成+取消;阻塞读由 IsBackground 进程退出回收不等待防挂)+重定向守卫沿用交互模式; 默认通道不变(ReadKeyPump 现役,--raw-input 显式灰度) | 验证: Host 编译零警告+selftest 冒烟过+RawStdinPumpTests 13/13
…节流走真实 stdin(终端本质即往 stdin 写这些字节,可信实测替代且可进 CI); 收敛=读线程退出(EOF 后半截序列残留 pending 属解析器正确语义不阻塞); 5s 超时熔断 fail-fast 带诊断(已收键数/pending); PendingCount 升 public 供探针消费 | 验证: 全表 OK(含 Ctrl+LeftArrow 修饰组合-ReadKey通道不可得形态/UTF-8中文多字节/paste整块)+半截paste与空输入快速FAIL非死等三场景
…节流走真实 stdin(终端本质即往 stdin 写这些字节,可信实测替代且可进 CI); 收敛=读线程退出(EOF 后半截序列残留 pending 属解析器正确语义不阻塞); 5s 超时熔断 fail-fast 带诊断(已收键数/pending); PendingCount 升 public 供探针消费 | 验证: 全表 OK(含 Ctrl+LeftArrow 修饰组合-ReadKey通道不可得形态/UTF-8中文多字节/paste整块)+半截paste与空输入快速FAIL非死等三场景
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
--raw-input宿主灰度开关(默认 ReadKeyPump 不变;Dispose 生命周期收尾)--selftest-input探针:管道喂 VT 字节流走真实 stdin 路径(修饰组合/UTF-8 中文/paste 整块全表断言 + 5s 熔断;半截/空输入快速 FAIL)Test plan
printf 'ab\x15\x1b[D\x1b[1;5D\x1b[200~中文粘贴内容\x1b[201~\x1f你\r' | exe --selftest-input→ OK