From 24dfbd4a550f2956ff9100eeba013b3013629095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 6 Oct 2026 21:32:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=B3=A8=E5=86=8C=E8=A1=A8?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=9B=E5=BB=BA=E7=9A=84=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E7=AA=97=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit export/registry.rs:在 load_or_create 注释里写明 NotFound 到原子写入之间被并发覆盖的窗口属于明确接受,与 xhs_minitool::registry::save 的口径一致。 --- apps/ai-game-creator-shell/src-tauri/src/export/registry.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/ai-game-creator-shell/src-tauri/src/export/registry.rs b/apps/ai-game-creator-shell/src-tauri/src/export/registry.rs index 275146002..2a777f71a 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/export/registry.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/export/registry.rs @@ -61,6 +61,12 @@ pub(crate) fn content_hash(text: &str) -> String { /// 读注册表;文件不存在时先用 `empty` 的规范序列化补一份空注册表,再读回来。 /// /// 「自动创建」是产品要求:面板一打开就要能显示空表单,而不是先报「文件不存在」。 +/// +/// 这里明确接受一个并发窗口:`read_to_string` 返回 `NotFound` 到下面 `write_atomically` 之间 +/// 没有锁,如果这期间别的写者(code agent 的脚本、并发的保存命令)抢先建好了同一个文件,本次 +/// 写入会用空注册表把它盖掉。不为此加锁或改成「原子重读 + 比较」:注册表本来就是用户与 agent +/// 共写的本机文件,真撞上时重新读一次就能看到最新内容,写入门禁级别的并发保证成本高于收益 +///(目标模块 `xhs_minitool::registry::save` 对同类窗口也是明确接受)。 pub(crate) fn load_or_create(path: &Path, empty: &T) -> Result, RegistryError> where T: Serialize + DeserializeOwned,