[Bf-blender-cvs] [856ef06] lib-link-rework-temp: Rework a bit new liblink code, to use our beloved memarena instead of ugly pile of malloc.
Bastien Montagne
noreply at git.blender.org
Fri Sep 18 22:25:32 CEST 2015
Commit: 856ef065b2b401e8208db6715a5e24551d70c401
Author: Bastien Montagne
Date: Fri Sep 18 22:22:56 2015 +0200
Branches: lib-link-rework-temp
https://developer.blender.org/rB856ef065b2b401e8208db6715a5e24551d70c401
Rework a bit new liblink code, to use our beloved memarena instead of ugly pile of malloc.
Performances are not an issue at all here, but it makes code slightly simpler, avoids
a loop over ghash of libs, avoids some potential mem fragmentation, and will be easier
with lib relocate code too in future...
===================================================================
M source/blender/windowmanager/intern/wm_operators.c
===================================================================
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 4453052..c0a4c4c 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -62,8 +62,10 @@
#include "BLI_bitmap.h"
#include "BLI_dial.h"
#include "BLI_dynstr.h" /*for WM_operator_pystring */
+#include "BLI_linklist.h"
#include "BLI_linklist_stack.h"
#include "BLI_math.h"
+#include "BLI_memarena.h"
#include "BLI_utildefines.h"
#include "BLI_ghash.h"
@@ -2607,48 +2609,70 @@ static short wm_link_append_flag(wmOperator *op)
}
typedef struct WMLinkAppendDataItem {
- char name[MAX_NAME];
+ char *name;
BLI_bitmap *libs; /* All libs (from WMLinkAppendData.libraries) to try to load this ID from. */
int idcode;
+
+ ID *new_id;
+ void *data;
} WMLinkAppendDataItem;
typedef struct WMLinkAppendData {
- char (*libraries)[FILE_MAX];
- WMLinkAppendDataItem *items;
+ LinkNode *libraries;
+ LinkNode *items;
int num_libraries;
int num_items;
short flag;
+
+ MemArena *memarena;
} WMLinkAppendData;
-static void wm_link_append_data_create(
- WMLinkAppendData *data, const int num_libraries, const int num_items, const int flag)
+static WMLinkAppendData *wm_link_append_data_new(const int flag)
{
- int i;
+ MemArena *ma = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, __func__);
+ WMLinkAppendData *lapp_data = BLI_memarena_calloc(ma, sizeof(*lapp_data));
- data->libraries = MEM_callocN(sizeof(*data->libraries) * (size_t)num_libraries, __func__);
- data->num_libraries = num_libraries;
+ lapp_data->flag = flag;
+ lapp_data->memarena = ma;
- data->items = MEM_callocN(sizeof(*data->items) * (size_t)num_items, __func__);
- data->num_items = num_items;
- for (i = 0; i < num_items; i++) {
- data->items[i].libs = BLI_BITMAP_NEW(num_libraries, __func__);
- }
+ return lapp_data;
+}
- data->flag = flag;
+static void wm_link_append_data_free(WMLinkAppendData *lapp_data)
+{
+ BLI_memarena_free(lapp_data->memarena);
}
-static void wm_link_append_data_delete(WMLinkAppendData *data)
+/* WARNING! *Never* call wm_link_append_data_library_add() after having added some items! */
+
+static void wm_link_append_data_library_add(WMLinkAppendData *lapp_data, const char *libname)
{
- int i;
+ size_t len = strlen(libname) + 1;
+ char *libpath = BLI_memarena_alloc(lapp_data->memarena, len);
- MEM_SAFE_FREE(data->libraries);
- data->num_libraries = 0;
+ BLI_strncpy(libpath, libname, len);
+ BLI_linklist_prepend_arena(&lapp_data->libraries, libpath, lapp_data->memarena);
+ lapp_data->num_libraries++;
+}
- for (i = 0; i < data->num_items; i++) {
- MEM_freeN(data->items[i].libs);
- }
- MEM_SAFE_FREE(data->items);
- data->num_items = 0;
+static WMLinkAppendDataItem *wm_link_append_data_item_add(
+ WMLinkAppendData *lapp_data, const char *idname, const int idcode, void *customdata)
+{
+ WMLinkAppendDataItem *item = BLI_memarena_alloc(lapp_data->memarena, sizeof(*item));
+ size_t len = strlen(idname) + 1;
+
+ item->name = BLI_memarena_alloc(lapp_data->memarena, len);
+ BLI_strncpy(item->name, idname, len);
+ item->idcode = idcode;
+ item->libs = BLI_BITMAP_NEW_MEMARENA(lapp_data->memarena, lapp_data->num_libraries);
+
+ item->new_id = NULL;
+ item->data = customdata;
+
+ BLI_linklist_prepend_arena(&lapp_data->items, item, lapp_data->memarena);
+ lapp_data->num_items++;
+
+ return item;
}
static void wm_link_do(
@@ -2660,15 +2684,17 @@ static void wm_link_do(
const int flag = lapp_data->flag;
- BLI_bitmap *done_items = BLI_BITMAP_NEW(lapp_data->num_items, __func__);
- char (*libname)[FILE_MAX];
+ BLI_bitmap *done_items = BLI_BITMAP_NEW_ALLOCA(lapp_data->num_items);
+ LinkNode *liblink, *itemlink;
int lib_idx, item_idx;
- int idcode;
BLI_assert(lapp_data->num_items && lapp_data->num_libraries);
- for (lib_idx = 0, libname = lapp_data->libraries; lib_idx < lapp_data->num_libraries; lib_idx++, libname++) {
- bh = BLO_blendhandle_from_file(*libname, reports);
+ for (lib_idx = 0, liblink = lapp_data->libraries; liblink; lib_idx++, liblink = liblink->next) {
+ char *libname = liblink->link;
+ int idcode;
+
+ bh = BLO_blendhandle_from_file(libname, reports);
if (bh == NULL) {
/* Unlikely since we just browsed it, but possible
@@ -2677,7 +2703,7 @@ static void wm_link_do(
}
/* here appending/linking starts */
- mainl = BLO_library_link_begin(bmain, &bh, *libname);
+ mainl = BLO_library_link_begin(bmain, &bh, libname);
lib = mainl->curlib;
BLI_assert(lib);
UNUSED_VARS_NDEBUG(lib);
@@ -2692,12 +2718,13 @@ static void wm_link_do(
/* For each lib file, we loop until we have (tried) to link all items belonging to that lib. */
BLI_BITMAP_SET_ALL(done_items, false, lapp_data->num_items);
while (true) {
- WMLinkAppendDataItem *item;
-
- for (item_idx = 0, idcode = -1, item = lapp_data->items;
- item_idx < lapp_data->num_items;
- item_idx++, item++)
+ for (item_idx = 0, idcode = -1, itemlink = lapp_data->items;
+ itemlink;
+ item_idx++, itemlink = itemlink->next)
{
+ WMLinkAppendDataItem *item = itemlink->link;
+ ID *new_id;
+
if (BLI_BITMAP_TEST(done_items, item_idx) || !BLI_BITMAP_TEST(item->libs, lib_idx)) {
continue;
}
@@ -2710,10 +2737,11 @@ static void wm_link_do(
BLI_BITMAP_ENABLE(done_items, item_idx);
- if (BLO_library_link_named_part_ex(mainl, &bh, item->name, idcode, flag, scene, v3d)) {
+ if ((new_id = BLO_library_link_named_part_ex(mainl, &bh, item->name, idcode, flag, scene, v3d))) {
/* If the link is sucessful, clear item's libs 'todo' flags.
* This avoids trying to link same item with other libraries to come. */
BLI_BITMAP_SET_ALL(item->libs, false, lapp_data->num_libraries);
+ item->new_id = new_id;
}
}
@@ -2726,8 +2754,6 @@ static void wm_link_do(
BLO_library_link_end(mainl, &bh, flag, scene, v3d);
BLO_blendhandle_close(bh);
}
-
- MEM_freeN(done_items);
}
static int wm_link_append_exec(bContext *C, wmOperator *op)
@@ -2735,7 +2761,7 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
PropertyRNA *prop;
- WMLinkAppendData lapp_data;
+ WMLinkAppendData *lapp_data;
char path[FILE_MAX_LIBEXTRA], root[FILE_MAXDIR], libname[FILE_MAX], relname[FILE_MAX];
char *group, *name;
int totfiles = 0;
@@ -2800,11 +2826,10 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
/* We define our working data...
* Note that here, each item 'uses' one library, and only one. */
+ lapp_data = wm_link_append_data_new(flag);
if (totfiles != 0) {
GHash *libraries = BLI_ghash_new(BLI_ghashutil_strhash_p, BLI_ghashutil_strcmp, __func__);
- GHashIterator libs_it;
int lib_idx = 0;
- int item_idx = 0;
RNA_BEGIN (op->ptr, itemptr, "files")
{
@@ -2817,23 +2842,16 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
continue;
}
- item_idx++;
-
if (!BLI_ghash_haskey(libraries, libname)) {
BLI_ghash_insert(libraries, BLI_strdup(libname), SET_INT_IN_POINTER(lib_idx));
lib_idx++;
+ wm_link_append_data_library_add(lapp_data, libname);
}
}
}
RNA_END;
- wm_link_append_data_create(&lapp_data, lib_idx, item_idx, flag);
- lib_idx = item_idx = 0;
-
- GHASH_ITER_INDEX(libs_it, libraries, lib_idx) {
- BLI_strncpy(lapp_data.libraries[lib_idx], BLI_ghashIterator_getKey(&libs_it),
- sizeof(*lapp_data.libraries));
- }
+ lib_idx = 0;
RNA_BEGIN (op->ptr, itemptr, "files")
{
@@ -2842,17 +2860,15 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
BLI_join_dirfile(path, sizeof(path), root, relname);
if (BLO_library_path_explode(path, libname, &group, &name)) {
+ WMLinkAppendDataItem *item;
if (!group || !name) {
continue;
}
lib_idx = GET_INT_FROM_POINTER(BLI_ghash_lookup(libraries, libname));
- BLI_strncpy(lapp_data.items[item_idx].name, name, sizeof(lapp_data.items[item_idx].name));
- lapp_data.items[item_idx].idcode = BKE_idcode_from_name(group);
- BLI_BITMAP_ENABLE(lapp_data.items[item_idx].libs, lib_idx);
-
- item_idx++;
+ item = wm_link_append_data_item_add(lapp_data, name, BKE_idcode_from_name(group), NULL);
+ BLI_BITMAP_ENABLE(item->libs, lib_idx);
}
}
RNA_END;
@@ -2860,18 +2876,16 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
BLI_ghash_free(libraries, MEM_freeN, NULL);
}
else {
- wm_link_append_data_create(&lapp_data, 1, 1, flag);
-
- BLI_strncpy(lapp_data.libraries[0], libname, sizeof(*lapp_data.libraries));
+ WMLinkAppendDataItem *item;
- BLI_strncpy(lapp_data.items[0].name, name, sizeof(lapp_data.items[0].name));
- lapp_data.items[0].idcode = BKE_idcode_from_name(group);
- BLI_BITMAP_ENABLE(lapp_data.items[0].libs, 0);
+ wm_link_append_data_library_add(lapp_data, libname);
+ item = wm_link_append_data_item_add(lapp_data, name, BKE_idcode_from_name(group), NULL);
+ BLI_BITMAP_ENABLE(item->libs, 0);
}
- wm_link_do(&lapp_data, op->reports, bmain, scene, CTX_wm_view3d(C));
+ wm_link_do(lapp_data, op->reports, bmain, scene, CTX_wm_view3d(C));
- wm_link_append_data_delete(&lapp_data);
+ wm_link_append_data_free(lapp_data);
/* mark all library linked objects to be updated */
BKE_main_lib_objects_recalc_all(bmain);
More information about the Bf-blender-cvs
mailing list