Page MenuHome

Fix badly broken caches handling during undo/redo.
ClosedPublic

Authored by Bastien Montagne (mont29) on Apr 5 2022, 6:45 PM.

Details

Summary

Original rework of caches during undo/redo (see D8183) had a very bad
flaw hidden in it: using the key of a ghash as source of data.

While this was effectively working then (cache pointer itself being part
of the key, and said cache pointers not being cleared on file write),
this is a general very bad way to do things.

Now that cache pointers are more and more cleared on file write (as part
of clearing runtime-data to reduce false-positives when checking if an
ID has changed or not), this has to be fixed properly by:

  • Not storing the cache pointer itself in the IDCacheKey.
  • In undo context, in readfile code trying to preserve caches, store the cache pointers as values of the mapping, together with the usages counter

The first change potentially affects all usages of
BKE_idtype_id_foreach_cache, but in practice this code is only used by
memfile reading code (i.e. undo) currently.

Related to T97015.

Diff Detail

Repository
rB Blender
Branch
T97015 (branched from master)
Build Status
Buildable 21476
Build 21476: arc lint + arc unit

Event Timeline

Bastien Montagne (mont29) requested review of this revision.Apr 5 2022, 6:45 PM
Bastien Montagne (mont29) created this revision.
NOTE: Basic undo on UDIM tiles operation now works, to some extend - but looks like Image editor is missing some proper update. Also, adding content in tiles, or adding new tiles, do not seem to ever add depsgraph tagging either, which is fairly weird...
This revision is now accepted and ready to land.Apr 5 2022, 7:08 PM