Blender V4.3
lib_id_delete.cc File Reference
#include "MEM_guardedalloc.h"
#include "DNA_ID.h"
#include "DNA_key_types.h"
#include "BLI_utildefines.h"
#include "BLI_listbase.h"
#include "BLI_set.hh"
#include "BLI_vector.hh"
#include "BKE_anim_data.hh"
#include "BKE_asset.hh"
#include "BKE_idprop.hh"
#include "BKE_idtype.hh"
#include "BKE_key.hh"
#include "BKE_layer.hh"
#include "BKE_lib_id.hh"
#include "BKE_lib_override.hh"
#include "BKE_lib_remap.hh"
#include "BKE_library.hh"
#include "BKE_main.hh"
#include "BKE_main_namemap.hh"
#include "lib_intern.hh"
#include "DEG_depsgraph.hh"

Go to the source code of this file.

Functions

void BKE_libblock_free_data (ID *id, const bool do_id_user)
 
void BKE_libblock_free_datablock (ID *id, const int)
 
static int id_free (Main *bmain, void *idv, int flag, const bool use_flag_from_idtag)
 
void BKE_id_free_ex (Main *bmain, void *idv, const int flag_orig, const bool use_flag_from_idtag)
 
void BKE_id_free (Main *bmain, void *idv)
 
void BKE_id_free_us (Main *bmain, void *idv)
 
static size_t id_delete (Main *bmain, blender::Set< ID * > &ids_to_delete, const int extra_remapping_flags)
 
void BKE_id_delete_ex (Main *bmain, void *idv, const int extra_remapping_flags)
 
void BKE_id_delete (Main *bmain, void *idv)
 
size_t BKE_id_multi_tagged_delete (Main *bmain)
 
size_t BKE_id_multi_delete (Main *bmain, blender::Set< ID * > &ids_to_delete)
 
Python Data Handling
void BKE_libblock_free_data_py (ID *id)
 

Detailed Description

Contains management of ID's for freeing & deletion.

Definition in file lib_id_delete.cc.

Function Documentation

◆ BKE_id_delete()

◆ BKE_id_delete_ex()

void BKE_id_delete_ex ( Main * bmain,
void * idv,
const int extra_remapping_flags )

Definition at line 360 of file lib_id_delete.cc.

References BLI_assert_msg, id_delete(), and ID_TAG_NO_MAIN.

Referenced by BKE_id_delete().

◆ BKE_id_free()

void BKE_id_free ( Main * bmain,
void * idv )

Complete ID freeing, should be usable in most cases (even for out-of-Main IDs).

See BKE_id_free_ex description for full details.

Parameters
bmainMain database containing the freed ID, can be NULL in case it's a temp ID outside of any Main.
idvPointer to ID to be freed.

Definition at line 201 of file lib_id_delete.cc.

References BKE_id_free_ex().

Referenced by arrayModifier_doArray(), blender::ed::object::bake(), BKE_blendfile_library_relocate(), BKE_crazyspace_build_sculpt(), BKE_crazyspace_get_first_deform_matrices_editbmesh(), BKE_grease_pencil_nomain_to_grease_pencil(), BKE_id_free_us(), BKE_image_merge(), BKE_lib_override_library_resync(), BKE_mesh_eval_geometry(), BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(), BKE_mesh_nomain_to_mesh(), BKE_object_free_caches(), BKE_object_free_derived_caches(), BKE_object_to_curve_clear(), BKE_object_to_mesh_clear(), BKE_pointcloud_nomain_to_pointcloud(), BKE_sculpt_get_first_deform_matrices(), BKE_workspace_layout_remove(), BKE_workspace_remove(), bpy_bmesh_from_object(), C_BVHTree_FromObject(), canvas_copyMesh(), blender::bke::CurveComponent::clear(), blender::bke::GreasePencilComponent::clear(), blender::bke::MeshComponent::clear(), blender::bke::PointCloudComponent::clear(), blender::bke::VolumeComponent::clear(), blender::io::obj::OBJMesh::clear(), SnapCache_EditMesh::clear(), cloth_build_springs(), construct_param_handle_subsurfed(), blender::io::ply::convert_ply_to_mesh(), blender::ed::object::create_applied_mesh_for_modifier(), deform_verts(), deform_verts(), distribute_particles_on_dm(), do_hair_dynamics(), do_multires_bake(), blender::io::alembic::ABCCurveWriter::do_write(), blender::io::usd::USDCurvesWriter::do_write(), dynamicPaint_brushMeshCalculateVelocity(), dynamicPaint_Modifier_apply(), dynamicPaint_Modifier_free_runtime(), dynamicPaint_paintMesh(), ED_workspace_delete(), blender::bke::editbmesh_calc_modifiers(), blender::ed::greasepencil::fill_strokes(), final_skin(), fluid_modifier_freeEffector(), fluid_modifier_freeFlow(), free_data(), free_data(), blender::io::alembic::ABCGenericMeshWriter::free_export_mesh(), blender::io::alembic::ABCMetaballWriter::free_export_mesh(), blender::io::usd::USDGenericMeshWriter::free_export_mesh(), blender::io::usd::USDMetaballWriter::free_export_mesh(), blender::ed::sculpt_paint::trim::free_geometry(), free_hair(), blender::bke::free_mesh_eval(), geometry_extract_apply(), blender::realtime_compositor::get_mask_raster_handles(), blender::ed::geometry::get_original_geometry_eval_copy(), blender::compositor::MaskOperation::init_execution(), knifeproject_poly_from_object(), lib_override_library_main_resync_on_library_indirect_level(), lineart_geometry_object_load(), blender::io::ply::load_plydata(), blender::geometry::boolean::mesh_boolean_float(), blender::bke::mesh_calc_modifiers(), mesh_new_from_curve_type_object(), mesh_remove_doubles_on_axis(), mesh_wrapper_ensure_subdivision(), mirror_apply_on_axis(), mirrorModifier__doMirror(), blender::ed::object::modifier_apply_shape(), modify_mesh(), modify_mesh(), multiresModifier_reshapeFromDeformModifier(), blender::nodes::node_geo_deform_curves_on_surface_cc::node_geo_exec(), blender::ed::space_node::node_group_ungroup(), blender::ed::object::object_convert_exec(), object_for_curve_to_mesh_free(), blender::ed::object::object_force_modifier_update_for_bind(), GeometryExporter::operator()(), paint_mask_slice_exec(), poselib_blend_free(), blender::io::usd::process_usdz_textures(), psys_thread_context_init_distribute(), blender::ed::object::quadriflow_start_job(), RE_bake_normal_world_to_tangent(), RE_bake_pixels_populate_from_objects(), read_libblock(), remap_hair_emitter(), blender::ed::object::remesh_symmetry_bisect(), blender::ed::object::remesh_symmetry_mirror(), seq_render_mask(), blender::ed::space_node::shader_preview_free(), blender::ed::geometry::store_result_geometry(), subdivide_edit_mesh(), blender::bke::greasepencil::tests::TEST(), blender::bke::greasepencil::tests::TEST(), blender::bke::greasepencil::tests::TEST(), blender::bke::tests::TEST(), blender::bke::tests::TEST(), blender::bke::tests::TEST(), blender::ed::greasepencil::tests::TEST(), blender::ed::greasepencil::tests::TEST(), blender::ed::greasepencil::tests::TEST(), blender::ed::greasepencil::tests::TEST(), blender::ed::greasepencil::tests::TEST(), blender::animrig::tests::TEST_F(), blender::animrig::tests::TEST_F(), blender::bke::bake::try_load_curves(), blender::bke::bake::try_load_grease_pencil(), blender::bke::bake::try_load_mesh(), blender::bke::bake::try_load_pointcloud(), blender::ed::sculpt_paint::trim::update_normals(), blender::ed::object::voxel_remesh_exec(), blender::eevee::MaterialModule::~MaterialModule(), and blender::eevee::World::~World().

◆ BKE_id_free_ex()

void BKE_id_free_ex ( Main * bmain,
void * idv,
int flag_orig,
bool use_flag_from_idtag )

Complete ID freeing, extended version for corner cases. Can override default (and safe!) freeing process, to gain some speed up.

At that point, given id is assumed to not be used by any other data-block already (might not be actually true, in case e.g. several inter-related IDs get freed together...). However, they might still be using (referencing) other IDs, this code takes care of it if ID_TAG_NO_USER_REFCOUNT is not defined.

Parameters
bmainMain database containing the freed ID, can be NULL in case it's a temp ID outside of any Main.
idvPointer to ID to be freed.
flag_origSet of LIB_ID_FREE_... flags controlling/overriding usual freeing process, 0 to get default safe behavior.
use_flag_from_idtagStill use freeing info flags from given ID data-block, even if some overriding ones are passed in flag parameter.

Definition at line 175 of file lib_id_delete.cc.

References BKE_layer_collection_resync_allow(), BKE_layer_collection_resync_forbid(), BKE_main_collection_sync_remap(), ELEM, GS, id_free(), ID_GR, ID_OB, ID_SCE, and LIB_ID_FREE_NO_MAIN.

Referenced by BKE_id_free(), BKE_lib_override_library_operations_store_finalize(), BKE_lib_override_library_operations_store_start(), BKE_lib_override_library_update(), BKE_main_clear(), and ED_mesh_join_objects_exec().

◆ BKE_id_free_us()

◆ BKE_id_multi_delete()

size_t BKE_id_multi_delete ( Main * bmain,
blender::Set< ID * > & ids_to_delete )

Properly delete all IDs from ids_to_delete, from given bmain database.

This is more efficient than calling BKE_id_delete repetitively on a large set of IDs (several times faster when deleting most of the IDs at once).

Note
The ID pointers are not removed from the Set (which may contain more pointers than originally given, when extra users or dependencies also had to be deleted with the original set of IDs). They are all freed though, so these pointers are all invalid after calling this function.
Returns
Number of deleted data-blocks.

Definition at line 387 of file lib_id_delete.cc.

References id_delete().

◆ BKE_id_multi_tagged_delete()

◆ BKE_libblock_free_data()

◆ BKE_libblock_free_data_py()

void BKE_libblock_free_data_py ( ID * id)

In most cases BKE_id_free_ex handles this, when lower level functions are called directly this function will need to be called too, if Python has access to the data.

ID data-blocks such as Material.nodetree are not stored in Main.

Definition at line 396 of file lib_id_delete.cc.

References BPY_DECREF_RNA_INVALIDATE(), BPY_id_release(), and UNUSED_VARS.

Referenced by blender::deg::deg_free_eval_copy_datablock(), id_free(), blender::bke::node_tree_free_embedded_tree(), scene_free_data(), and wm_file_read_setup_wm_use_new().

◆ BKE_libblock_free_datablock()

◆ id_delete()

static size_t id_delete ( Main * bmain,
blender::Set< ID * > & ids_to_delete,
const int extra_remapping_flags )
static

Definition at line 237 of file lib_id_delete.cc.

References blender::bke::id::IDRemapper::add(), blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::add(), blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::begin(), BKE_key_from_id(), BKE_layer_collection_resync_allow(), BKE_layer_collection_resync_forbid(), BKE_libblock_relink_multiple(), BKE_libblock_remap_multiple_locked(), BKE_library_main_rebuild_hierarchy(), BKE_main_collection_sync_remap(), BKE_main_lock(), BKE_main_namemap_remove_name(), BKE_main_unlock(), BLI_remlink(), blender::bke::id::IDRemapper::clear(), blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::contains(), blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::end(), FOREACH_MAIN_LISTBASE_ID_BEGIN, FOREACH_MAIN_LISTBASE_ID_END, GS, Key::id, Library::id, ID_FAKE_USERS, id_free(), ID_IS_LINKED, ID_LI, ID_REMAP_FORCE_INTERNAL_RUNTIME_POINTERS, ID_REMAP_FORCE_NEVER_NULL_USAGE, ID_REMAP_SKIP_USER_CLEAR, ID_REMAP_STORE_NEVER_NULL_USAGE, ID_REMAP_TYPE_CLEANUP, ID_TAG_NO_MAIN, INDEX_ID_MAX, Main::is_memfile_undo_written, ID::lib, LIB_ID_FREE_NO_MAIN, LIB_ID_FREE_NO_UI_USER, LIB_ID_FREE_NO_USER_REFCOUNT, ID::name, blender::bke::id::IDRemapper::never_null_users(), set_listbasepointers(), Main::shapekeys, and blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::size().

Referenced by BKE_id_delete_ex(), BKE_id_multi_delete(), and BKE_id_multi_tagged_delete().

◆ id_free()