Fix T85756: Adjust Last Operation panel is slow.

Extremely subttle bug that would only appear in some specific
circumstances, would cause memfile undo writing code to falsely detect
some ID as changed because it would get the wrong 'starting point' of
comparison with existing previous memfile step.

See T85756 for detailed explanation and reproducible case.
This commit is contained in:
Bastien Montagne 2022-04-14 16:41:02 +02:00 committed by Philipp Oeser
parent 49e1144832
commit f1173749c2
Notes: blender-bot 2023-02-14 08:42:54 +01:00
Referenced by issue #88449: Blender LTS: Maintenance Task 2.93
Referenced by issue #88449, Blender LTS: Maintenance Task 2.93
Referenced by issue #85756, Adjust Last Operation panel is slow (some Undo/Redo happening?)
1 changed files with 7 additions and 4 deletions

View File

@ -454,11 +454,14 @@ static void mywrite_id_begin(WriteData *wd, ID *id)
if (wd->use_memfile) {
wd->mem.current_id_session_uuid = id->session_uuid;
/* If current next memchunk does not match the ID we are about to write, try to find the
* correct memchunk in the mapping using ID's session_uuid. */
/* If current next memchunk does not match the ID we are about to write, or is not the _first_
* one for said ID, try to find the correct memchunk in the mapping using ID's session_uuid. */
MemFileChunk *curr_memchunk = wd->mem.reference_current_chunk;
MemFileChunk *prev_memchunk = curr_memchunk != NULL ? curr_memchunk->prev : NULL;
if (wd->mem.id_session_uuid_mapping != NULL &&
(wd->mem.reference_current_chunk == NULL ||
wd->mem.reference_current_chunk->id_session_uuid != id->session_uuid)) {
(curr_memchunk == NULL || curr_memchunk->id_session_uuid != id->session_uuid ||
(prev_memchunk != NULL &&
(prev_memchunk->id_session_uuid == curr_memchunk->id_session_uuid)))) {
void *ref = BLI_ghash_lookup(wd->mem.id_session_uuid_mapping,
POINTER_FROM_UINT(id->session_uuid));
if (ref != NULL) {