mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-25 01:40:57 +00:00
Two threads writing one target without a lock shared the same temporary name, so one could truncate it under the other; the name now carries a per-call counter. The helper takes its content as chunks, which lets the vendor cache hand over its header and body without copying the blob, and AppConfig::save() goes through it too, including the Windows backup copy, so the config's temporaries get the same handling as everyone else's. Copying the target's permissions onto the temporary set a read-only bit that stopped the rename itself on Windows; they are applied after the rename there. The two-step rename fallback triggers on whatever error a mount reports when the target is still there, since FUSE, gvfs and MTP refuse a replacing rename with errors other than the three it handled. Every successful write sweeps stale temporaries of its own target, so leftovers beside the bundle metadata, physical printers, plugin config and profile cache are covered, and the older OrcaSlicer.conf.<pid> form with them. The bundle metadata guard is taken per file, never while the bundle registry's writer lock is held, so the two are not taken in both orders. The lock guard's open-and-lock steps are one block, and the read-only choice lives in user_presets_lock_path() instead of at each call site. The vendor cache test that blocked the old fixed temporary name with a directory provokes the failure through permissions instead.
OrcaSlicer tests
Building, running and writing tests is documented on the wiki, under How to Test.
Two files here rather than there, because coding agents only read what is in the repository: