mirror of
https://github.com/storytold/wordcraft.git
synced 2026-11-01 06:16:58 -06:00
Review of #4171: cacheable() shrank an oversized picture to half the cache minus its source size, so a source of 64 MiB or more left no room, and the cache, which counted the source bytes each entry held, refused the entry. Such a picture (an uncompressed 5000 × 5000 BMP is 75 MB) was still decoded on every render. A broken source of 128 MiB or more was refused the same way, so its decode was retried on every render too. The cache held each source Arc only to recognise it. Before #293 it keyed entries by the raw address, which a freed source could hand to new bytes. A Weak keeps that guarantee, since the allocation itself stays while the Weak lives, but the bytes are freed with the document. The cache now counts only what it decoded, and cacheable() no longer depends on the source size. Tests: the #3665 test caches its shrunk picture for a source larger than the whole cache. media_cache_counts_what_it_keeps_and_lets_sources_go replaces media_cache_counts_the_source_bytes_it_holds, which pinned the old accounting, and the same-allocation test also checks that a freed source's address isn't taken for a new one. Counting the source again fails two tests; keeping a strong reference fails one.