mirror of
https://github.com/storytold/lightcraft.git
synced 2026-10-14 19:27:01 -04:00
`--help`, the module doc and the README promise that a `--memory` session "writes nothing", and the desktop app broke that in two places: - `PrefsWriter` saved `ui.json` whenever the UI state changed (issue #164), so a throwaway session's `thumbSize`, window layout or language replaced the user's saved settings — the README showcase script does exactly that. - The GPU crash sentinel from #136 armed itself in every session except `LIGHTCRAFT_NO_PREFS` (issue #169); `with_init_marker` creates the settings folder to hold `gpu-init.marker`, removes the marker and leaves the folder, so a `--memory` run on a fresh home left an empty `Library/Application Support/LightCraft` behind. Now `PrefsWriter` carries its target path (`None` for `--memory`, `LIGHTCRAFT_NO_PREFS` or no home folder) and writes nothing without one; it also writes nothing while the session is the one offered when the library can't be opened (the question window and Continue Without Saving, which `docs/control-protocol.md` already describes as writing nothing) and resumes when `app.openLibrary` ends it. `gpu_crash_check(in_memory)` neither arms the sentinel nor removes a marker in a `--memory` session; it still reads one (new `read_init_marker`), so GPU rendering starts off there too and the next ordinary launch reports and clears it. A `--memory` session still reads `ui.json`, but a damaged one is reported and left in place rather than set aside. Normal launches are unchanged. Tests: `prefs_writer_writes_nothing_in_a_memory_or_temporary_session`, `memory_session_leaves_the_gpu_marker_and_folder_alone`, `memory_session_leaves_a_damaged_ui_json_alone` (apps/lightcraft), and `read_init_marker` coverage in the gpu crate's marker test. Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
1 parent
629e39380e
commit
c1861e5416
4 files changed
+155
-25
No files matched your search
@@ -155,8 +155,16 @@ pub(crate) fn with_init_marker<T>(backends: Backends, f: impl FnOnce() -> T) ->
|
||||
/// If the init marker `path` is present — the last process died while creating the GPU device —
|
||||
/// remove it and return what it recorded.
|
||||
pub fn take_init_marker(path: &std::path::Path) -> Option<String> {
|
||||
let text = std::fs::read_to_string(path).ok()?;
|
||||
let text = read_init_marker(path)?;
|
||||
let _ = std::fs::remove_file(path);
|
||||
Some(text)
|
||||
}
|
||||
|
||||
/// What the init marker `path` recorded, if it is present — without removing it. For sessions
|
||||
/// that must leave the disk as they found it (`--memory`, issues #164 and #169): GPU rendering
|
||||
/// still starts off, and the marker stays for the next ordinary launch to report and clear.
|
||||
pub fn read_init_marker(path: &std::path::Path) -> Option<String> {
|
||||
let text = std::fs::read_to_string(path).ok()?;
|
||||
Some(text.trim().to_string())
|
||||
}
|
||||
|
||||
@@ -225,10 +233,13 @@ mod tests {
|
||||
set_init_marker(None);
|
||||
assert!(seen, "the marker exists while the device is created");
|
||||
assert!(!m.exists(), "and is removed afterwards");
|
||||
// a marker left behind by a crashed process is reported once
|
||||
// a marker left behind by a crashed process is reported once; reading it leaves it in place
|
||||
std::fs::write(&m, "GPU device creation started (backends DX12)").unwrap();
|
||||
assert!(read_init_marker(&m).unwrap().contains("DX12"));
|
||||
assert!(m.exists(), "read_init_marker leaves the marker for the next launch");
|
||||
assert!(take_init_marker(&m).unwrap().contains("DX12"));
|
||||
assert_eq!(take_init_marker(&m), None);
|
||||
assert_eq!(read_init_marker(&m), None);
|
||||
let _ = std::fs::remove_dir_all(&dir);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user