e3ce41306e
- Util/AutoTranslate.cs introduces a single EntriesLock object and serializes every read and write of the static Entries dictionary and ValidEntries hash set behind it. PreloadCache spawns a worker thread that fills both while the main thread reads them via the Matching / ReplaceWithPayload / StartsWithCommand entry points; without the lock the underlying collection access was undefined. AllEntries() splits into a thin lock wrapper plus a private BuildEntriesLocked() helper that runs under the lock - Ui/SettingsTabs/Privacy.cs bounds the .Wait() on the framework refresh after a manual retention sweep and after the privacy cleanup. A hung framework tick previously could deadlock the background worker thread. Five-second timeout, log on miss