[Bf-blender-cvs] [6ba8c393a01] id-ensure-unique-memory-address: Rework a bit re-allocating code, add a lookup utils for history memaddresses.

Bastien Montagne noreply at git.blender.org
Wed Feb 26 12:19:38 CET 2020


Commit: 6ba8c393a01e721bf0676f7aac06595378b71050
Author: Bastien Montagne
Date:   Wed Feb 26 12:18:34 2020 +0100
Branches: id-ensure-unique-memory-address
https://developer.blender.org/rB6ba8c393a01e721bf0676f7aac06595378b71050

Rework a bit re-allocating code, add a lookup utils for history memaddresses.

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

M	source/blender/blenkernel/BKE_main.h
M	source/blender/blenkernel/intern/main.c

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

diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h
index dec142624f2..a090ca49872 100644
--- a/source/blender/blenkernel/BKE_main.h
+++ b/source/blender/blenkernel/BKE_main.h
@@ -51,6 +51,7 @@ 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). */
@@ -170,19 +171,15 @@ 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 *(*realloc_cb)(void *vmemh,
-                                                            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_relations_create(struct Main *bmain, const short flag);
 void BKE_main_relations_free(struct Main *bmain);
diff --git a/source/blender/blenkernel/intern/main.c b/source/blender/blenkernel/intern/main.c
index 35657cae382..4518983c10c 100644
--- a/source/blender/blenkernel/intern/main.c
+++ b/source/blender/blenkernel/intern/main.c
@@ -296,6 +296,26 @@ bool BKE_main_idmemhash_register_id(Main *bmain, void *old_vmemh, ID *id)
   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 the first one in the chain. */
+  return used_id_chain != NULL ? used_id_chain->link : vmemh;
+}
+
 void *BKE_main_idmemhash_unique_alloc(Main *bmain,
                                       void *old_vmemh,
                                       void *(*alloc_cb)(size_t len, const char *str),
@@ -316,23 +336,16 @@ void *BKE_main_idmemhash_unique_alloc(Main *bmain,
   return id_mem;
 }
 
-void *BKE_main_idmemhash_unique_realloc(Main *bmain,
-                                        void *old_vmemh,
-                                        void *vmemh,
-                                        void *(*realloc_cb)(void *vmemh,
-                                                            size_t len,
-                                                            const char *str),
-                                        size_t size,
-                                        const char *message)
+void *BKE_main_idmemhash_unique_realloc(Main *bmain, void *old_vmemh, void *vmemh)
 {
-  void *id_mem = realloc_cb(vmemh, size, message);
+  void *id_mem = MEM_dupallocN(vmemh);
   if (bmain != NULL && bmain->used_id_memhash != NULL) {
     ListBase generated_ids = {.first = NULL};
     int count = 0;
     while (UNLIKELY(!BKE_main_idmemhash_register_id(bmain, old_vmemh, id_mem))) {
       printf("Allocating ID re-used memory address %p, trying again (%d)...\n", id_mem, ++count);
       BLI_addtail(&generated_ids, id_mem);
-      id_mem = realloc_cb(id_mem, size, message);
+      id_mem = MEM_dupallocN(id_mem);
     }
     BLI_freelistN(&generated_ids);
   }



More information about the Bf-blender-cvs mailing list