From 2601501fce554290d9245fdbcb536c7c87c73f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Tue, 22 Dec 2020 14:05:49 +0100 Subject: 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 --- source/blender/blenkernel/intern/lib_id_delete.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'source/blender/blenkernel/intern/lib_id_delete.c') 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); } -- cgit v1.2.3