perf(coordinator): 可选热键 supervisor 注册成功即退出,消除稳态轮询#671
Conversation
issue #470:combo/translation/action 三类可选热键 supervisor 原本注册成功后不退出,稳态 每 5s 醒来读 prefs,多线程常驻空转。改为对齐主 hotkey_supervisor_loop 的 exit-on-success 模式——到达「已安装」或「已主动停用」稳态即 return 退出,零轮询。 安全前提(已逐函数确认):用户启用/改/停这些热键时,set_*_hotkey 命令与 persist_settings diff 都会调 update_*_hotkey_binding,其覆盖「monitor 为 None → 从零 start+spawn」安装路径, 故退出后启停改键无需重启即时生效;ComboHotkeyMonitor 注册后驻留、无运行中自注销,monitor 不会自己死,无需 supervisor 守护。失败重试 sleep(3s)/recv_timeout(5s)/app未就绪 sleep(1s) 等有界路径全部保留。
PR Reviewer Guide 🔍Here are some key observations to aid the review process:
|
|
Claude finished @appergb's task in 2m 53s —— View job PR #671 审查:可选热键 supervisor exit-on-success
结论:逻辑正确,可合并三个核心问题全部通过。详细分析如下。 1. return 处是否确为稳态(非有界重试路径)✅逐函数确认,所有
2. update_*_binding 从零安装 monitor ✅用户启用未配置热键时,
// 在 run_on_main_thread 内:
if let Some(monitor) = inner_clone.combo_hotkey.lock().as_ref() {
monitor.update_binding(...); // 已有:换绑
return;
}
// None 路径:
ComboHotkeyMonitor::start(binding, tx) // 从零安装
*inner_clone.combo_hotkey.lock() = Some(monitor);
spawn(combo_hotkey_bridge_loop) // 连同 bridge 一并起
三者均无遗漏。用户启用 → 3. 竞态检查 ✅(无新增)supervisor 与 update_*_binding 并发安装(TOCTOU): 理论路径:supervisor 检查 此竞态在 PR 前同样存在( monitor 生命期: exit-on-success 后的重装链:supervisor 退出 → 用户改键 → 细节观察(非阻塞)
monitor.update_modifier_shortcuts(qa_trigger, translation_trigger);而 总结改动纯控制流,稳态识别准确,从零安装路径完整,无新增竞态,有界重试路径全部保留。 |
User description
源自 #470 Cloud 性能审查 #2。combo/translation/action 三类可选热键 supervisor 原本注册成功后不退出,稳态每 5s 醒来读 prefs,多线程常驻空转。
改动:对齐主
hotkey_supervisor_loop的 exit-on-success 模式——到达「已安装」或「已主动停用」稳态即return退出,零稳态轮询。仅改控制流(sleep+continue→return),无新增锁。安全前提(已逐函数确认):用户启用/改/停这些热键时
set_*_hotkey命令与persist_settingsdiff 都会调update_*_hotkey_binding,其覆盖「monitor 为 None → 从零 start+spawn」安装路径 → 退出后启停改键无需重启即时生效;ComboHotkeyMonitor 注册后驻留、无运行中自注销 → monitor 不会自己死,无需守护。有界路径(失败重试 3s / recv_timeout 5s / app未就绪 1s)全部保留。验证:macOS
cargo check通过 + 对抗式复审 pass。Windows/Linux cfg 分支靠 CI(控制流三端等价,无 cfg 分歧)。PR Type
Enhancement
Description
消除 combo/translation/action 可选热键 supervisor 的稳态轮询
对齐主 supervisor 的 exit-on-success 模式:注册成功即 return 退出
依赖 update_*_hotkey_binding 主动路径确保启停即时生效,无需守护
Diagram Walkthrough
flowchart LR Before("之前") --> Loop("loop {}") --> Check1["检查 prefs"] --> Decision1{"已安装/已禁用?"} Decision1 -->|是| Uninstall["卸载热键"] --> Sleep["sleep 5s"] --> Loop Decision1 -->|否| Decision2{"Monitor 已存在?"} Decision2 -->|是| Sleep Decision2 -->|否| Install["安装热键"] --> ReturnBefore["保持 loop"] After("之后") --> Loop2["loop {}"] --> Check2["检查 prefs"] --> Decision3{"已安装/已禁用?"} Decision3 -->|是| Uninstall2["卸载热键"] --> ReturnAfter1["return"] Decision3 -->|否| Decision4{"Monitor 已存在?"} Decision4 -->|是| ReturnAfter2["return"] Decision4 -->|否| Install2["安装热键"] --> ReturnAfter3["return"]File Walkthrough
coordinator.rs
supervisor loop exit-on-successopenless-all/app/src-tauri/src/coordinator.rs
主动路径