[Bf-blender-cvs] [da0b2d8ee8f] uuid-undo-experiments: Revert "Rework the whole unique ID system to also store ID addresses history in Main's mapping."

Bastien Montagne noreply at git.blender.org
Fri Feb 28 15:45:59 CET 2020


Commit: da0b2d8ee8f2a5cc4b603d900e078e3e2da7b4d9
Author: Bastien Montagne
Date:   Fri Feb 28 15:24:50 2020 +0100
Branches: uuid-undo-experiments
https://developer.blender.org/rBda0b2d8ee8f2a5cc4b603d900e078e3e2da7b4d9

Revert "Rework the whole unique ID system to also store ID addresses history in Main's mapping."

This reverts commit 726e6972160159cc9d5b2be9cfb618f7362acc81.

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

M	source/blender/blenkernel/BKE_main.h
M	source/blender/blenkernel/intern/blender.c
M	source/blender/blenkernel/intern/lib_id.c
M	source/blender/blenkernel/intern/main.c
M	source/blender/blenloader/intern/readfile.c

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

diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h
index 50db422614b..b6d21643b68 100644
--- a/source/blender/blenkernel/BKE_main.h
+++ b/source/blender/blenkernel/BKE_main.h
@@ -51,7 +51,6 @@ struct GHash;
 struct GSet;
 struct ImBuf;
 struct Library;
-struct LinkNode;
 struct MainLock;
 
 /* Blender thumbnail, as written on file (width, height, and data as char RGBA). */
@@ -106,9 +105,8 @@ typedef struct Main {
    */
   char use_memfile_full_barrier;
 
-  struct GHash *used_id_memhash;
-  struct LinkNode *used_id_memhash_history_chains;
-  short used_id_memhash_tag;
+  struct GSet *used_id_memset;
+  short used_id_memset_tag;
 
   BlendThumbnail *blen_thumb;
 
@@ -162,7 +160,7 @@ typedef struct Main {
 
 /* Main.used_id_memory_pointers_tag */
 enum {
-  MAIN_IDMEMHASH_OWNER = 1 << 0,
+  MAIN_IDMEMSET_OWNER = 1 << 0,
 };
 
 struct Main *BKE_main_new(void);
@@ -171,20 +169,22 @@ void BKE_main_free(struct Main *mainvar);
 void BKE_main_lock(struct Main *bmain);
 void BKE_main_unlock(struct Main *bmain);
 
-void BKE_main_idmemhash_ensure(struct Main *bmain);
-void BKE_main_idmemhash_release(struct Main *bmain);
-void BKE_main_idmemhash_transfer_ownership(struct Main *bmain_dst, struct Main *bmain_src);
-void BKE_main_idmemhash_usefrom(struct Main *bmain_user, struct Main *bmain_src);
-bool BKE_main_idmemhash_register_id(struct Main *bmain, void *old_vmemh, struct ID *id);
-struct ID *BKE_main_idmemhash_lookup_id(struct Main *bmain,
-                                        void *vmemh,
-                                        struct LinkNode **r_used_id_chain);
-void *BKE_main_idmemhash_unique_alloc(struct Main *bmain,
-                                      void *old_vmemh,
-                                      void *(*alloc_cb)(size_t len, const char *str),
-                                      size_t size,
-                                      const char *message);
-void *BKE_main_idmemhash_unique_realloc(struct Main *bmain, void *old_vmemh, void *vmemh);
+void BKE_main_idmemset_ensure(struct Main *bmain);
+void BKE_main_idmemset_release(struct Main *bmain);
+void BKE_main_idmemset_transfer_ownership(struct Main *bmain_dst, struct Main *bmain_src);
+void BKE_main_idmemset_usefrom(struct Main *bmain_user, struct Main *bmain_src);
+bool BKE_main_idmemset_register_id(struct Main *bmain, struct ID *id);
+void *BKE_main_idmemset_unique_alloc(struct Main *bmain,
+                                     void *(*alloc_cb)(size_t len, const char *str),
+                                     size_t size,
+                                     const char *message);
+void *BKE_main_idmemset_unique_realloc(struct Main *bmain,
+                                       void *vmemh,
+                                       void *(*realloc_cb)(void *vmemh,
+                                                           size_t len,
+                                                           const char *str),
+                                       size_t size,
+                                       const char *message);
 
 void BKE_main_relations_create(struct Main *bmain, const short flag);
 void BKE_main_relations_free(struct Main *bmain);
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index a828ede92bb..7a145f41c32 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -127,7 +127,7 @@ void BKE_blender_globals_init(void)
   U.savetime = 1;
 
   G_MAIN = BKE_main_new();
-  BKE_main_idmemhash_ensure(G_MAIN);
+  BKE_main_idmemset_ensure(G_MAIN);
 
   strcpy(G.ima, "//");
 
diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c
index 09ff670e81c..132f86755b6 100644
--- a/source/blender/blenkernel/intern/lib_id.c
+++ b/source/blender/blenkernel/intern/lib_id.c
@@ -1198,7 +1198,7 @@ void *BKE_libblock_alloc_notest(Main *bmain, short type)
   const char *name;
   size_t size = BKE_libblock_get_alloc_info(type, &name);
   if (size != 0) {
-    return BKE_main_idmemhash_unique_alloc(bmain, NULL, MEM_callocN, size, name);
+    return BKE_main_idmemset_unique_alloc(bmain, MEM_callocN, size, name);
   }
   BLI_assert(!"Request to allocate unknown data type");
   return NULL;
diff --git a/source/blender/blenkernel/intern/main.c b/source/blender/blenkernel/intern/main.c
index 12ee548c871..bf7d7fc00ab 100644
--- a/source/blender/blenkernel/intern/main.c
+++ b/source/blender/blenkernel/intern/main.c
@@ -29,7 +29,6 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_ghash.h"
-#include "BLI_linklist.h"
 #include "BLI_mempool.h"
 #include "BLI_threads.h"
 
@@ -195,7 +194,7 @@ void BKE_main_free(Main *mainvar)
     BKE_main_relations_free(mainvar);
   }
 
-  BKE_main_idmemhash_release(mainvar);
+  BKE_main_idmemset_release(mainvar);
 
   BLI_spin_end((SpinLock *)mainvar->lock);
   MEM_freeN(mainvar->lock);
@@ -212,121 +211,64 @@ void BKE_main_unlock(struct Main *bmain)
   BLI_spin_unlock((SpinLock *)bmain->lock);
 }
 
-void BKE_main_idmemhash_ensure(Main *bmain)
+void BKE_main_idmemset_ensure(Main *bmain)
 {
-  if (bmain->used_id_memhash == NULL || (bmain->used_id_memhash_tag & MAIN_IDMEMHASH_OWNER) == 0) {
-    bmain->used_id_memhash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__);
-    bmain->used_id_memhash_history_chains = NULL;
-    bmain->used_id_memhash_tag |= MAIN_IDMEMHASH_OWNER;
+  if (bmain->used_id_memset == NULL || (bmain->used_id_memset_tag & MAIN_IDMEMSET_OWNER) == 0) {
+    bmain->used_id_memset = BLI_gset_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__);
+    bmain->used_id_memset_tag |= MAIN_IDMEMSET_OWNER;
   }
 }
 
-static void main_idmemhash_history_chains_free(void *linkv)
+void BKE_main_idmemset_release(Main *bmain)
 {
-  LinkNode *link = linkv;
-  BLI_linklist_free(link, NULL);
-}
-
-void BKE_main_idmemhash_release(Main *bmain)
-{
-  if (bmain->used_id_memhash != NULL) {
-    if ((bmain->used_id_memhash_tag & MAIN_IDMEMHASH_OWNER) != 0) {
-      BLI_ghash_free(bmain->used_id_memhash, NULL, NULL);
-      BLI_linklist_free(bmain->used_id_memhash_history_chains, main_idmemhash_history_chains_free);
+  if (bmain->used_id_memset != NULL) {
+    if ((bmain->used_id_memset_tag & MAIN_IDMEMSET_OWNER) != 0) {
+      BLI_gset_free(bmain->used_id_memset, NULL);
     }
-    bmain->used_id_memhash = NULL;
-    bmain->used_id_memhash_history_chains = NULL;
-    bmain->used_id_memhash_tag &= ~MAIN_IDMEMHASH_OWNER;
+    bmain->used_id_memset = NULL;
+    bmain->used_id_memset_tag &= ~MAIN_IDMEMSET_OWNER;
   }
 }
 
-void BKE_main_idmemhash_transfer_ownership(Main *bmain_dst, Main *bmain_src)
+void BKE_main_idmemset_transfer_ownership(Main *bmain_dst, Main *bmain_src)
 {
-  BKE_main_idmemhash_release(bmain_dst);
+  BKE_main_idmemset_release(bmain_dst);
 
-  BLI_assert(bmain_src->used_id_memhash != NULL);
-  BLI_assert(bmain_src->used_id_memhash_tag & MAIN_IDMEMHASH_OWNER);
+  BLI_assert(bmain_src->used_id_memset != NULL);
+  BLI_assert(bmain_src->used_id_memset_tag & MAIN_IDMEMSET_OWNER);
 
-  bmain_dst->used_id_memhash = bmain_src->used_id_memhash;
-  bmain_dst->used_id_memhash_history_chains = bmain_src->used_id_memhash_history_chains;
-  bmain_dst->used_id_memhash_tag |= MAIN_IDMEMHASH_OWNER;
-  bmain_src->used_id_memhash_tag &= ~MAIN_IDMEMHASH_OWNER;
+  bmain_dst->used_id_memset = bmain_src->used_id_memset;
+  bmain_dst->used_id_memset_tag |= MAIN_IDMEMSET_OWNER;
+  bmain_src->used_id_memset_tag &= ~MAIN_IDMEMSET_OWNER;
 }
 
-void BKE_main_idmemhash_usefrom(Main *bmain_user, Main *bmain_src)
+void BKE_main_idmemset_usefrom(Main *bmain_user, Main *bmain_src)
 {
-  BKE_main_idmemhash_release(bmain_user);
+  BKE_main_idmemset_release(bmain_user);
 
-  BLI_assert(bmain_src->used_id_memhash != NULL);
-  bmain_user->used_id_memhash = bmain_src->used_id_memhash;
-  bmain_user->used_id_memhash_history_chains = bmain_src->used_id_memhash_history_chains;
+  BLI_assert(bmain_src->used_id_memset != NULL);
+  bmain_user->used_id_memset = bmain_src->used_id_memset;
 }
 
 /**
  * @return true if the ID was successfully added to the memset, false if it already existed.
  */
-bool BKE_main_idmemhash_register_id(Main *bmain, void *old_vmemh, ID *id)
+bool BKE_main_idmemset_register_id(Main *bmain, ID *id)
 {
-  BLI_assert(bmain->used_id_memhash != NULL);
-  BLI_assert(old_vmemh != id);
-  void **val;
-  if (!BLI_ghash_ensure_p(bmain->used_id_memhash, id, &val)) {
-    if (old_vmemh != NULL) {
-      LinkNode **chain_hook = (LinkNode **)BLI_ghash_lookup_p(bmain->used_id_memhash, old_vmemh);
-      BLI_assert(chain_hook != NULL);
-      if (*chain_hook == NULL) {
-        /* That datablock only ever had one address so far, we need to initialize its addresses
-         * history chain. */
-        *chain_hook = MEM_callocN(sizeof(**chain_hook), __func__);
-        LinkNode *old_id_entry = MEM_mallocN(sizeof(*old_id_entry), __func__);
-        old_id_entry->link = old_vmemh;
-        old_id_entry->next = NULL;
-        BLI_linklist_prepend_nlink(
-            &bmain->used_id_memhash_history_chains, old_id_entry, *chain_hook);
-      }
-      LinkNode *curr_id_entry = MEM_mallocN(sizeof(*curr_id_entry), __func__);
-      BLI_linklist_prepend_nlink((LinkNode **)&(*chain_hook)->link, id, curr_id_entry);
-      *val = *chain_hook;
-    }
-    else {
-      *val = NULL;
-    }
-    return true;
-  }
-  return false;
-}
-
-/**
- * Lookup a random ID memory address, and return its last known valid instance, and the linked list
- * of all its known addresses so far.
- *
- * \param r_used_id_chain If not NULL, and that address has had several previous instances, the
- * linked list storing all of those.
- * \return The last known instance address matching given \a vmemh pointer, or vmemh itself if it
- * is unknown.
- */
-ID *BKE_main_idmemhash_lookup_id(Main *bmain, void *vmemh, LinkNode **r_used_id_chain)
-{
-  LinkNode *used_id_chain_hook = BLI_ghash_lookup(bmain->used_id_memhash, vmemh);
-  LinkNode *used_id_chain = used_id_chain_hook ? used_id_chain_hook->link : NULL;
-  if (r_used_id_chain != NULL) {
-    *r_used_id_chain = used_id_chain;
-  }
-  /* The last valid address should always be

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list