[Bf-blender-cvs] [625db1d] master: Avoid interface ID remapping when freeing the whole database

Sergey Sharybin noreply at git.blender.org
Tue Nov 15 15:56:45 CET 2016


Commit: 625db1d86eab7d1a24f8ce01f12f7ffb945dea14
Author: Sergey Sharybin
Date:   Tue Nov 15 15:46:52 2016 +0100
Branches: master
https://developer.blender.org/rB625db1d86eab7d1a24f8ce01f12f7ffb945dea14

Avoid interface ID remapping when freeing the whole database

This makes heavy scenes to be freed almost instantly (so now
quadbot scene takes only 0.06sec to free),

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

M	source/blender/blenkernel/BKE_library.h
M	source/blender/blenkernel/intern/blendfile.c
M	source/blender/blenkernel/intern/library.c
M	source/blender/blenkernel/intern/library_remap.c

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

diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index 39e8d71..afe13b2 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -65,7 +65,7 @@ struct ID *BKE_libblock_find_name(const short type, const char *name) ATTR_WARN_
 
 /* library_remap.c (keep here since they're general functions) */
 void  BKE_libblock_free(struct Main *bmain, void *idv) ATTR_NONNULL();
-void  BKE_libblock_free_ex(struct Main *bmain, void *idv, const bool do_id_user) ATTR_NONNULL();
+void  BKE_libblock_free_ex(struct Main *bmain, void *idv, const bool do_id_user, const bool do_ui_user) ATTR_NONNULL();
 void  BKE_libblock_free_us(struct Main *bmain, void *idv) ATTR_NONNULL();
 void  BKE_libblock_free_data(struct Main *bmain, struct ID *id) ATTR_NONNULL();
 void  BKE_libblock_free_data_ex(struct Main *bmain, struct ID *id, const bool do_id_user) ATTR_NONNULL();
diff --git a/source/blender/blenkernel/intern/blendfile.c b/source/blender/blenkernel/intern/blendfile.c
index 6da6847..54f709a 100644
--- a/source/blender/blenkernel/intern/blendfile.c
+++ b/source/blender/blenkernel/intern/blendfile.c
@@ -407,9 +407,9 @@ bool BKE_blendfile_read_from_memfile(
 	if (bfd) {
 		/* remove the unused screens and wm */
 		while (bfd->main->wm.first)
-			BKE_libblock_free_ex(bfd->main, bfd->main->wm.first, true);
+			BKE_libblock_free_ex(bfd->main, bfd->main->wm.first, true, true);
 		while (bfd->main->screen.first)
-			BKE_libblock_free_ex(bfd->main, bfd->main->screen.first, true);
+			BKE_libblock_free_ex(bfd->main, bfd->main->screen.first, true, true);
 
 		setup_app_data(C, bfd, "<memory1>", reports);
 	}
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index e5b066a..3411eae 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1211,46 +1211,46 @@ void BKE_main_free(Main *mainvar)
 		
 		while ( (id = lb->first) ) {
 #if 1
-			BKE_libblock_free_ex(mainvar, id, false);
+			BKE_libblock_free_ex(mainvar, id, false, false);
 #else
 			/* errors freeing ID's can be hard to track down,
 			 * enable this so valgrind will give the line number in its error log */
 			switch (a) {
-				case   0: BKE_libblock_free_ex(mainvar, id, false); break;
-				case   1: BKE_libblock_free_ex(mainvar, id, false); break;
-				case   2: BKE_libblock_free_ex(mainvar, id, false); break;
-				case   3: BKE_libblock_free_ex(mainvar, id, false); break;
-				case   4: BKE_libblock_free_ex(mainvar, id, false); break;
-				case   5: BKE_libblock_free_ex(mainvar, id, false); break;
-				case   6: BKE_libblock_free_ex(mainvar, id, false); break;
-				case   7: BKE_libblock_free_ex(mainvar, id, false); break;
-				case   8: BKE_libblock_free_ex(mainvar, id, false); break;
-				case   9: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  10: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  11: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  12: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  13: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  14: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  15: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  16: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  17: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  18: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  19: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  20: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  21: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  22: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  23: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  24: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  25: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  26: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  27: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  28: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  29: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  30: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  31: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  32: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  33: BKE_libblock_free_ex(mainvar, id, false); break;
-				case  34: BKE_libblock_free_ex(mainvar, id, false); break;
+				case   0: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case   1: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case   2: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case   3: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case   4: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case   5: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case   6: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case   7: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case   8: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case   9: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  10: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  11: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  12: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  13: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  14: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  15: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  16: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  17: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  18: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  19: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  20: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  21: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  22: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  23: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  24: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  25: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  26: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  27: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  28: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  29: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  30: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  31: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  32: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  33: BKE_libblock_free_ex(mainvar, id, false, false); break;
+				case  34: BKE_libblock_free_ex(mainvar, id, false, false); break;
 				default:
 					BLI_assert(0);
 					break;
@@ -1852,7 +1852,7 @@ void BKE_library_make_local(
 			 *       However, this is a highly-risky presumption, and nice crasher in case something goes wrong here.
 			 *       So for 2.78a will keep the safe option, and switch to more efficient one in master later. */
 #if 1
-			BKE_libblock_free_ex(bmain, id, false);
+			BKE_libblock_free_ex(bmain, id, false, true);
 #else
 			BKE_libblock_unlink(bmain, id, false, false);
 			BKE_libblock_free(bmain, id);
diff --git a/source/blender/blenkernel/intern/library_remap.c b/source/blender/blenkernel/intern/library_remap.c
index 4262972..4133342 100644
--- a/source/blender/blenkernel/intern/library_remap.c
+++ b/source/blender/blenkernel/intern/library_remap.c
@@ -711,8 +711,11 @@ void BKE_libblock_free_data_ex(Main *bmain, ID *id, const bool do_id_user)
  * used in headerbuttons.c image.c mesh.c screen.c sound.c and library.c
  *
  * \param do_id_user: if \a true, try to release other ID's 'references' hold by \a idv.
+ *                    (only applies to main database)
+ * \param do_ui_user: similar to do_id_user but makes sure UI does not hold references to
+ *                    \a id.
  */
-void BKE_libblock_free_ex(Main *bmain, void *idv, const bool do_id_user)
+void BKE_libblock_free_ex(Main *bmain, void *idv, const bool do_id_user, const bool do_ui_user)
 {
 	ID *id = idv;
 	short type = GS(id->name);
@@ -837,12 +840,14 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, const bool do_id_user)
 	/* avoid notifying on removed data */
 	BKE_main_lock(bmain);
 
-	if (free_notifier_reference_cb) {
-		free_notifier_reference_cb(id);
-	}
+	if (do_ui_user) {
+		if (free_notifier_reference_cb) {
+			free_notifier_reference_cb(id);
+		}
 
-	if (remap_editor_id_reference_cb) {
-		remap_editor_id_reference_cb(id, NULL);
+		if (remap_editor_id_reference_cb) {
+			remap_editor_id_reference_cb(id, NULL);
+		}
 	}
 
 	BLI_remlink(lb, id);
@@ -855,7 +860,7 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, const bool do_id_user)
 
 void BKE_libblock_free(Main *bmain, void *idv)
 {
-	BKE_libblock_free_ex(bmain, idv, true);
+	BKE_libblock_free_ex(bmain, idv, true, true);
 }
 
 void BKE_libblock_free_us(Main *bmain, void *idv)      /* test users */




More information about the Bf-blender-cvs mailing list