[Bf-blender-cvs] [388e468a042] id-ensure-unique-memory-address: Factorize unique ID mem address allocation into a util functions.
Bastien Montagne
noreply at git.blender.org
Fri Feb 14 18:58:26 CET 2020
Commit: 388e468a0429d3cc6eb8291f9ee94fa3bf498149
Author: Bastien Montagne
Date: Fri Feb 14 18:58:01 2020 +0100
Branches: id-ensure-unique-memory-address
https://developer.blender.org/rB388e468a0429d3cc6eb8291f9ee94fa3bf498149
Factorize unique ID mem address allocation into a util functions.
===================================================================
M source/blender/blenkernel/BKE_main.h
M source/blender/blenkernel/intern/lib_id.c
M source/blender/blenkernel/intern/main.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h
index 03edc93ac16..aa72b85cc1c 100644
--- a/source/blender/blenkernel/BKE_main.h
+++ b/source/blender/blenkernel/BKE_main.h
@@ -169,6 +169,10 @@ 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_relations_create(struct Main *bmain, const short flag);
void BKE_main_relations_free(struct Main *bmain);
diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c
index 0c8d7cf4777..8fbb54e3cda 100644
--- a/source/blender/blenkernel/intern/lib_id.c
+++ b/source/blender/blenkernel/intern/lib_id.c
@@ -1198,17 +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) {
- ID *id_mem = MEM_callocN(size, name);
- if (bmain != NULL && bmain->used_id_memset != NULL) {
- ListBase generated_ids = {.first = NULL};
- while (UNLIKELY(!BKE_main_idmemset_register_id(bmain, id_mem))) {
- printf("Allocating ID re-used memory address %p, trying again...", id_mem);
- BLI_addtail(&generated_ids, id_mem);
- id_mem = MEM_callocN(size, name);
- }
- BLI_freelistN(&generated_ids);
- }
- return id_mem;
+ 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 30dff086f6c..732d57e622a 100644
--- a/source/blender/blenkernel/intern/main.c
+++ b/source/blender/blenkernel/intern/main.c
@@ -259,6 +259,25 @@ bool BKE_main_idmemset_register_id(Main *bmain, ID *id)
return BLI_gset_add(bmain->used_id_memset, id);
}
+void *BKE_main_idmemset_unique_alloc(Main *bmain,
+ void *(*alloc_cb)(size_t len, const char *str),
+ size_t size,
+ const char *message)
+{
+ void *id_mem = alloc_cb(size, message);
+ if (bmain != NULL && bmain->used_id_memset != NULL) {
+ ListBase generated_ids = {.first = NULL};
+ int count = 0;
+ while (UNLIKELY(!BKE_main_idmemset_register_id(bmain, 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 = alloc_cb(size, message);
+ }
+ BLI_freelistN(&generated_ids);
+ }
+ return id_mem;
+}
+
static int main_relations_create_idlink_cb(LibraryIDLinkCallbackData *cb_data)
{
MainIDRelations *rel = cb_data->user_data;
More information about the Bf-blender-cvs
mailing list