Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSybren A. Stüvel <sybren@blender.org>2020-12-22 16:05:49 +0300
committerSybren A. Stüvel <sybren@blender.org>2020-12-22 16:05:49 +0300
commit2601501fce554290d9245fdbcb536c7c87c73f11 (patch)
treea077501b38cddabfe5158e3d886ae55ce7606495 /source/blender/blenkernel/intern/lib_id_delete.c
parent512a23c3d61d3ac454e9c098ddbf1d0d3beb19a0 (diff)
RNA: make `bpy.data.orphans_purge()` return number of deleted datablocks
Sometimes multiple calls to `bpy.data.orphans_purge()` are needed to delete all orphans, because a call can turn previously-used datablocks into orphans. Returning the number of deleted datablocks makes it possible to keep looping until nothing can be deleted any more. This patch keeps track of deletions in `id_delete()` so that it can be returned up the call stack. Reviewed By: mont29 Differential Revision: https://developer.blender.org/D9918
Diffstat (limited to 'source/blender/blenkernel/intern/lib_id_delete.c')
-rw-r--r--source/blender/blenkernel/intern/lib_id_delete.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/lib_id_delete.c b/source/blender/blenkernel/intern/lib_id_delete.c
index 7199bd0f13c..8075660dcd1 100644
--- a/source/blender/blenkernel/intern/lib_id_delete.c
+++ b/source/blender/blenkernel/intern/lib_id_delete.c
@@ -237,7 +237,7 @@ void BKE_id_free_us(Main *bmain, void *idv) /* test users */
}
}
-static void id_delete(Main *bmain, const bool do_tagged_deletion)
+static size_t id_delete(Main *bmain, const bool do_tagged_deletion)
{
const int tag = LIB_TAG_DOIT;
ListBase *lbarray[MAX_LIBARRAY];
@@ -346,6 +346,7 @@ static void id_delete(Main *bmain, const bool do_tagged_deletion)
* have been already cleared when we reach it
* (e.g. Objects being processed before meshes, they'll have already released their 'reference'
* over meshes when we come to freeing obdata). */
+ size_t num_datablocks_deleted = 0;
for (i = do_tagged_deletion ? 1 : base_count; i--;) {
ListBase *lb = lbarray[i];
ID *id, *id_next;
@@ -360,11 +361,13 @@ static void id_delete(Main *bmain, const bool do_tagged_deletion)
BLI_assert(id->us == 0);
}
BKE_id_free_ex(bmain, id, free_flag, !do_tagged_deletion);
+ ++num_datablocks_deleted;
}
}
}
bmain->is_memfile_undo_written = false;
+ return num_datablocks_deleted;
}
/**
@@ -386,8 +389,9 @@ void BKE_id_delete(Main *bmain, void *idv)
*
* \warning Considered experimental for now, seems to be working OK but this is
* risky code in a complicated area.
+ * \return Number of deleted datablocks.
*/
-void BKE_id_multi_tagged_delete(Main *bmain)
+size_t BKE_id_multi_tagged_delete(Main *bmain)
{
- id_delete(bmain, true);
+ return id_delete(bmain, true);
}