[Bf-blender-cvs] [ad245a25e23] master: Fix T85756: Adjust Last Operation panel is slow.

Bastien Montagne noreply at git.blender.org
Thu Apr 14 16:47:13 CEST 2022


Commit: ad245a25e235884ffb756f95e1d82f67f5197bf1
Author: Bastien Montagne
Date:   Thu Apr 14 16:41:02 2022 +0200
Branches: master
https://developer.blender.org/rBad245a25e235884ffb756f95e1d82f67f5197bf1

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.

===================================================================

M	source/blender/blenloader/intern/writefile.c

===================================================================

diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 490328106ca..2ae660ab1b6 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -611,11 +611,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) {



More information about the Bf-blender-cvs mailing list