Blender  V2.93
Functions
lib_id_delete.c File Reference
#include "MEM_guardedalloc.h"
#include "DNA_ID.h"
#include "DNA_key_types.h"
#include "BLI_utildefines.h"
#include "BLI_listbase.h"
#include "BKE_anim_data.h"
#include "BKE_asset.h"
#include "BKE_idprop.h"
#include "BKE_idtype.h"
#include "BKE_key.h"
#include "BKE_lib_id.h"
#include "BKE_lib_override.h"
#include "BKE_lib_remap.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "lib_intern.h"
#include "DEG_depsgraph.h"

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 UNUSED(flag))
 
void BKE_id_free_ex (Main *bmain, void *idv, int flag, 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, const bool do_tagged_deletion)
 
void BKE_id_delete (Main *bmain, void *idv)
 
size_t BKE_id_multi_tagged_delete (Main *bmain)
 
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.c.

Function Documentation

◆ BKE_id_delete()

void BKE_id_delete ( Main bmain,
void *  idv 
)

◆ 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 199 of file lib_id_delete.c.

References BKE_id_free_ex().

Referenced by bake(), BKE_crazyspace_build_sculpt(), BKE_crazyspace_get_first_deform_matrices_editbmesh(), BKE_editmesh_free_derivedmesh(), BKE_fluid_modifier_freeEffector(), BKE_fluid_modifier_freeFlow(), BKE_id_free_us(), BKE_image_merge(), BKE_mesh_create_derived_for_modifier(), BKE_mesh_eval_geometry(), BKE_mesh_from_nurbs_displist(), BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(), BKE_mesh_nomain_to_mesh(), BKE_mesh_remesh_voxel_fix_poles(), BKE_mesh_runtime_clear_cache(), BKE_object_free_caches(), BKE_object_to_curve_clear(), BKE_object_to_mesh_clear(), BKE_sculpt_get_first_deform_matrices(), BKE_workspace_layout_remove(), BKE_workspace_remove(), bpy_bmesh_from_object(), C_BVHTree_FromObject(), canvas_copyMesh(), MeshComponent::clear(), PointCloudComponent::clear(), VolumeComponent::clear(), cloth_build_springs(), construct_param_handle_subsurfed(), curve_calc_modifiers_post(), deformMatrices(), deformVerts(), deformVertsEM(), distribute_particles_on_dm(), do_hair_dynamics(), dynamicPaint_brushMeshCalculateVelocity(), dynamicPaint_Modifier_apply(), dynamicPaint_Modifier_free_runtime(), dynamicPaint_paintMesh(), ED_workspace_delete(), editbmesh_calc_modifiers(), EEVEE_shaders_free(), final_skin(), blender::io::alembic::ABCGenericMeshWriter::free_export_mesh(), blender::io::usd::USDGenericMeshWriter::free_export_mesh(), blender::io::alembic::ABCMetaballWriter::free_export_mesh(), blender::io::usd::USDMetaballWriter::free_export_mesh(), free_hair(), freeData(), geometry_extract_apply(), gpencil_do_frame_fill(), hair_evaluate_modifiers(), blender::compositor::MaskOperation::initExecution(), knifeproject_poly_from_object(), lib_relocate_do(), mesh_calc_modifiers(), mesh_new_from_curve_type_object(), mirrorModifier__doMirror(), MOD_deform_mesh_eval_get(), modifier_apply_shape(), modifier_modify_mesh_and_geometry_set(), modifyMesh(), multiresModifier_reshapeFromDeformModifier(), node_group_ungroup(), GeometryExporter::operator()(), paint_mask_slice_exec(), psys_thread_context_init_distribute(), quadriflow_start_job(), RE_bake_normal_world_to_tangent(), RE_bake_pixels_populate_from_objects(), read_libblock(), remap_hair_emitter(), remesh_symmetry_bisect(), remesh_symmetry_mirror(), MeshComponent::replace_mesh_but_keep_vertex_group_names(), sculpt_gesture_trim_geometry_free(), sculpt_gesture_trim_normals_update(), seq_render_mask(), and volume_evaluate_modifiers().

◆ BKE_id_free_ex()

void BKE_id_free_ex ( Main bmain,
void *  idv,
int  flag,
const 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 LIB_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.
flagSet 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 datablock, even if some overriding ones are passed in flag parameter.

Definition at line 106 of file lib_id_delete.c.

References BKE_id_free_ex(), BKE_key_from_id(), BKE_libblock_free_data(), BKE_libblock_free_data_py(), BKE_libblock_free_datablock(), BKE_libblock_relink_ex(), BKE_main_lock(), BKE_main_unlock(), BLI_assert, BLI_remlink(), DEG_id_type_tag(), free_notifier_reference_cb, GS, id, Key::id, Main::is_locked_for_linking, LIB_ID_FREE_NO_DEG_TAG, LIB_ID_FREE_NO_MAIN, LIB_ID_FREE_NO_UI_USER, LIB_ID_FREE_NO_USER_REFCOUNT, LIB_ID_FREE_NOT_ALLOCATED, LIB_TAG_NO_MAIN, LIB_TAG_NO_USER_REFCOUNT, LIB_TAG_NOT_ALLOCATED, MEM_freeN, ID::name, NULL, remap_editor_id_reference_cb, ID::tag, type, and which_libbase().

Referenced by BKE_id_free(), BKE_id_free_ex(), BKE_lib_override_library_operations_store_finalize(), BKE_lib_override_library_operations_store_start(), BKE_lib_override_library_update(), BKE_main_free(), ED_mesh_join_objects_exec(), and id_delete().

◆ BKE_id_free_us()

void BKE_id_free_us ( Main bmain,
void *  idv 
)

◆ BKE_id_multi_tagged_delete()

size_t BKE_id_multi_tagged_delete ( Main bmain)

Properly delete all IDs tagged with LIB_TAG_DOIT, in 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)...

Warning
Considered experimental for now, seems to be working OK but this is risky code in a complicated area.
Returns
Number of deleted datablocks.

Definition at line 398 of file lib_id_delete.c.

References id_delete().

Referenced by BKE_lib_override_library_delete(), BKE_lib_override_library_resync(), bpy_batch_remove(), bpy_orphans_purge(), object_delete_exec(), outliner_delete_exec(), and outliner_orphans_purge_exec().

◆ BKE_libblock_free_data()

void BKE_libblock_free_data ( ID id,
const bool  do_id_user 
)

◆ 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 413 of file lib_id_delete.c.

References BPY_DECREF_RNA_INVALIDATE(), BPY_id_release(), id, ID::py_instance, and UNUSED_VARS.

Referenced by BKE_id_free_ex(), ntreeFreeEmbeddedTree(), scene_free_data(), and wm_close_and_free_all().

◆ BKE_libblock_free_datablock()

void BKE_libblock_free_datablock ( ID id,
const int   UNUSEDflag 
)

Definition at line 75 of file lib_id_delete.c.

References BKE_idtype_get_info_from_id(), BLI_assert, IDTypeInfo::free_data, and NULL.

Referenced by BKE_id_free_ex().

◆ id_delete()

static size_t id_delete ( Main bmain,
const bool  do_tagged_deletion 
)
static