[Bf-blender-cvs] [b7da42911c] app-templates: Fix leak freeing addons

Campbell Barton noreply at git.blender.org
Mon Mar 20 02:28:00 CET 2017


Commit: b7da42911c55103a865fe8cdfa360b692d5f2376
Author: Campbell Barton
Date:   Mon Mar 20 12:32:26 2017 +1100
Branches: app-templates
https://developer.blender.org/rBb7da42911c55103a865fe8cdfa360b692d5f2376

Fix leak freeing addons

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

M	source/blender/blenkernel/intern/blender.c

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

diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index 5d5c099d12..ce3b623002 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -157,17 +157,10 @@ void BKE_blender_userdef_set_data(UserDef *userdef)
 	U = *userdef;
 }
 
-/**
- * When loading a new userdef from file,
- * or when exiting Blender.
- */
-void BKE_blender_userdef_free_data(UserDef *userdef)
+static void userdef_free_keymaps(UserDef *userdef)
 {
-#define U _invalid_access_ /* ensure no accidental global access */
-#ifdef U  /* quiet warning */
-#endif
-
-	for (wmKeyMap *km = userdef->user_keymaps.first; km; km = km->next) {
+	for (wmKeyMap *km = userdef->user_keymaps.first, *km_next; km; km = km_next) {
+		km_next = km->next;
 		for (wmKeyMapDiffItem *kmdi = km->diff_items.first; kmdi; kmdi = kmdi->next) {
 			if (kmdi->add_item) {
 				keymap_item_free(kmdi->add_item);
@@ -185,8 +178,14 @@ void BKE_blender_userdef_free_data(UserDef *userdef)
 
 		BLI_freelistN(&km->diff_items);
 		BLI_freelistN(&km->items);
+
+		MEM_freeN(km);
 	}
+	BLI_listbase_clear(&userdef->user_keymaps);
+}
 
+static void userdef_free_addons(UserDef *userdef)
+{
 	for (bAddon *addon = userdef->addons.first, *addon_next; addon; addon = addon_next) {
 		addon_next = addon->next;
 		if (addon->prop) {
@@ -195,6 +194,21 @@ void BKE_blender_userdef_free_data(UserDef *userdef)
 		}
 		MEM_freeN(addon);
 	}
+	BLI_listbase_clear(&userdef->addons);
+}
+
+/**
+ * When loading a new userdef from file,
+ * or when exiting Blender.
+ */
+void BKE_blender_userdef_free_data(UserDef *userdef)
+{
+#define U _invalid_access_ /* ensure no accidental global access */
+#ifdef U  /* quiet warning */
+#endif
+
+	userdef_free_keymaps(userdef);
+	userdef_free_addons(userdef);
 
 	for (uiFont *font = userdef->uifonts.first; font; font = font->next) {
 		BLF_unload_id(font->blf_id);
@@ -207,7 +221,6 @@ void BKE_blender_userdef_free_data(UserDef *userdef)
 	BLI_freelistN(&userdef->uistyles);
 	BLI_freelistN(&userdef->uifonts);
 	BLI_freelistN(&userdef->themes);
-	BLI_freelistN(&userdef->user_keymaps);
 
 #undef U
 }
@@ -244,6 +257,9 @@ void BKE_blender_userdef_set_template(UserDef *userdef)
 #define MEMCPY_OVERRIDE(id) \
 	memcpy(U.id, userdef->id, sizeof(U.id));
 
+	/* for some types we need custom free functions */
+	userdef_free_addons(&U);
+
 	LIST_OVERRIDE(uistyles);
 	LIST_OVERRIDE(uifonts);
 	LIST_OVERRIDE(themes);




More information about the Bf-blender-cvs mailing list