Blender  V3.3
Functions | Variables
lib_id_delete.c File Reference
#include "CLG_log.h"
#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_layer.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 "BKE_main_namemap.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)
 

Variables

static CLG_LogRef LOG = {.identifier = "bke.lib_id_delete"}
 

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 ( struct Main bmain,
void idv 
)

◆ BKE_id_free()

void BKE_id_free ( struct 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 172 of file lib_id_delete.c.

References BKE_id_free_ex().

Referenced by bake(), BKE_blendfile_library_relocate(), BKE_crazyspace_build_sculpt(), BKE_crazyspace_get_first_deform_matrices_editbmesh(), BKE_fluid_modifier_freeEffector(), BKE_fluid_modifier_freeFlow(), BKE_id_free_us(), BKE_image_merge(), BKE_lib_override_library_resync(), BKE_mesh_create_derived_for_modifier(), BKE_mesh_eval_geometry(), BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(), BKE_mesh_nomain_to_mesh(), 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(), CurveComponent::clear(), VolumeComponent::clear(), cloth_build_springs(), construct_param_handle_subsurfed(), deformMatrices(), deformVerts(), deformVertsEM(), distribute_particles_on_dm(), do_hair_dynamics(), do_multires_bake(), 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(), blender::compositor::MaskOperation::init_execution(), knifeproject_poly_from_object(), lib_override_library_main_resync_on_library_indirect_level(), lineart_geometry_object_load(), mesh_calc_modifiers(), mesh_new_from_curve_type_object(), mesh_wrapper_ensure_subdivision(), mirrorModifier__doMirror(), MOD_deform_mesh_eval_get(), modifier_apply_shape(), modifyMesh(), multiresModifier_reshapeFromDeformModifier(), blender::nodes::node_geo_deform_curves_on_surface_cc::node_geo_exec(), blender::ed::space_node::node_group_ungroup(), object_for_curve_to_mesh_free(), GeometryExporter::operator()(), paint_mask_slice_exec(), poselib_blend_free(), 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(), sculpt_gesture_trim_geometry_free(), sculpt_gesture_trim_normals_update(), seq_render_mask(), blender::bke::tests::TEST(), voxel_remesh_exec(), and blender::eevee::MaterialModule::~MaterialModule().

◆ BKE_id_free_ex()

void BKE_id_free_ex ( struct Main bmain,
void idv,
int  flag,
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 82 of file lib_id_delete.c.

References BKE_id_free_ex(), BKE_id_remapper_add(), BKE_id_remapper_create(), BKE_id_remapper_free(), 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_namemap_remove_name(), BKE_main_unlock(), BLI_assert, BLI_remlink(), DEG_id_type_tag(), free_notifier_reference_cb, GS, id, Key::id, ID_REMAP_SKIP_USER_CLEAR, Main::is_locked_for_linking, LIB_ID_FREE_NO_DEG_TAG, LIB_ID_FREE_NO_MAIN, LIB_ID_FREE_NO_NAMEMAP_REMOVE, 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 ( struct Main bmain,
void idv 
)

◆ BKE_id_multi_tagged_delete()

size_t BKE_id_multi_tagged_delete ( struct 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 377 of file lib_id_delete.c.

References id_delete().

Referenced by BKE_blendfile_append(), BKE_blendfile_library_relocate(), BKE_lib_override_library_delete(), bpy_batch_remove(), bpy_orphans_purge(), lib_override_library_resync(), object_delete_exec(), outliner_delete_exec(), outliner_id_delete_invoke(), outliner_id_operation_exec(), outliner_lib_operation_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 ( struct 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 386 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(), blender::deg::deg_free_copy_on_write_datablock(), 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 68 of file lib_id_delete.c.

References BKE_idtype_get_info_from_id(), BLI_assert_msg, 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

Variable Documentation

◆ LOG

CLG_LogRef LOG = {.identifier = "bke.lib_id_delete"}
static

Definition at line 42 of file lib_id_delete.c.

Referenced by id_delete().