Initial step for IDTypeInfo refactor 'cleanup' project.
[blender.git] / source / blender / blenkernel / intern / lib_id_delete.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup bke
19  *
20  * Contains management of ID's for freeing & deletion.
21  */
22
23 #include "MEM_guardedalloc.h"
24
25 /* all types are needed here, in order to do memory operations */
26 #include "DNA_armature_types.h"
27 #include "DNA_brush_types.h"
28 #include "DNA_camera_types.h"
29 #include "DNA_cachefile_types.h"
30 #include "DNA_collection_types.h"
31 #include "DNA_gpencil_types.h"
32 #include "DNA_ipo_types.h"
33 #include "DNA_key_types.h"
34 #include "DNA_light_types.h"
35 #include "DNA_lattice_types.h"
36 #include "DNA_linestyle_types.h"
37 #include "DNA_material_types.h"
38 #include "DNA_mesh_types.h"
39 #include "DNA_meta_types.h"
40 #include "DNA_movieclip_types.h"
41 #include "DNA_mask_types.h"
42 #include "DNA_node_types.h"
43 #include "DNA_object_types.h"
44 #include "DNA_lightprobe_types.h"
45 #include "DNA_scene_types.h"
46 #include "DNA_screen_types.h"
47 #include "DNA_speaker_types.h"
48 #include "DNA_sound_types.h"
49 #include "DNA_text_types.h"
50 #include "DNA_vfont_types.h"
51 #include "DNA_windowmanager_types.h"
52 #include "DNA_workspace_types.h"
53 #include "DNA_world_types.h"
54
55 #include "BLI_utildefines.h"
56
57 #include "BLI_listbase.h"
58
59 #include "BKE_action.h"
60 #include "BKE_armature.h"
61 #include "BKE_brush.h"
62 #include "BKE_camera.h"
63 #include "BKE_cachefile.h"
64 #include "BKE_collection.h"
65 #include "BKE_curve.h"
66 #include "BKE_font.h"
67 #include "BKE_gpencil.h"
68 #include "BKE_idprop.h"
69 #include "BKE_idtype.h"
70 #include "BKE_image.h"
71 #include "BKE_ipo.h"
72 #include "BKE_key.h"
73 #include "BKE_light.h"
74 #include "BKE_lattice.h"
75 #include "BKE_lib_id.h"
76 #include "BKE_lib_override.h"
77 #include "BKE_lib_remap.h"
78 #include "BKE_library.h"
79 #include "BKE_linestyle.h"
80 #include "BKE_mesh.h"
81 #include "BKE_material.h"
82 #include "BKE_main.h"
83 #include "BKE_mask.h"
84 #include "BKE_mball.h"
85 #include "BKE_movieclip.h"
86 #include "BKE_node.h"
87 #include "BKE_object.h"
88 #include "BKE_paint.h"
89 #include "BKE_particle.h"
90 #include "BKE_lightprobe.h"
91 #include "BKE_speaker.h"
92 #include "BKE_sound.h"
93 #include "BKE_screen.h"
94 #include "BKE_scene.h"
95 #include "BKE_text.h"
96 #include "BKE_texture.h"
97 #include "BKE_workspace.h"
98 #include "BKE_world.h"
99
100 #include "lib_intern.h"
101
102 #include "DEG_depsgraph.h"
103
104 #ifdef WITH_PYTHON
105 #  include "BPY_extern.h"
106 #endif
107
108 /* Not used currently. */
109 // static CLG_LogRef LOG = {.identifier = "bke.lib_id_delete"};
110
111 void BKE_libblock_free_data(ID *id, const bool do_id_user)
112 {
113   if (id->properties) {
114     IDP_FreePropertyContent_ex(id->properties, do_id_user);
115     MEM_freeN(id->properties);
116   }
117
118   if (id->override_library) {
119     BKE_lib_override_library_free(&id->override_library, do_id_user);
120   }
121
122   /* XXX TODO remove animdata handling from each type's freeing func,
123    * and do it here, like for copy! */
124 }
125
126 void BKE_libblock_free_datablock(ID *id, const int UNUSED(flag))
127 {
128   const IDTypeInfo *idtype_info = BKE_idtype_get_info_from_id(id);
129
130   if (idtype_info != NULL) {
131     if (idtype_info->free_data != NULL) {
132       idtype_info->free_data(id);
133     }
134     return;
135   }
136
137   const short type = GS(id->name);
138   switch (type) {
139     case ID_SCE:
140       BKE_scene_free_ex((Scene *)id, false);
141       break;
142     case ID_LI:
143       BKE_library_free((Library *)id);
144       break;
145     case ID_OB:
146       BKE_object_free((Object *)id);
147       break;
148     case ID_ME:
149       BKE_mesh_free((Mesh *)id);
150       break;
151     case ID_CU:
152       BKE_curve_free((Curve *)id);
153       break;
154     case ID_MB:
155       BKE_mball_free((MetaBall *)id);
156       break;
157     case ID_MA:
158       BKE_material_free((Material *)id);
159       break;
160     case ID_TE:
161       BKE_texture_free((Tex *)id);
162       break;
163     case ID_IM:
164       BKE_image_free((Image *)id);
165       break;
166     case ID_LT:
167       BKE_lattice_free((Lattice *)id);
168       break;
169     case ID_LA:
170       BKE_light_free((Light *)id);
171       break;
172     case ID_CA:
173       BKE_camera_free((Camera *)id);
174       break;
175     case ID_IP: /* Deprecated. */
176       BKE_ipo_free((Ipo *)id);
177       break;
178     case ID_KE:
179       BKE_key_free((Key *)id);
180       break;
181     case ID_WO:
182       BKE_world_free((World *)id);
183       break;
184     case ID_SCR:
185       BKE_screen_free((bScreen *)id);
186       break;
187     case ID_VF:
188       BKE_vfont_free((VFont *)id);
189       break;
190     case ID_TXT:
191       BKE_text_free((Text *)id);
192       break;
193     case ID_SPK:
194       BKE_speaker_free((Speaker *)id);
195       break;
196     case ID_LP:
197       BKE_lightprobe_free((LightProbe *)id);
198       break;
199     case ID_SO:
200       BKE_sound_free((bSound *)id);
201       break;
202     case ID_GR:
203       BKE_collection_free((Collection *)id);
204       break;
205     case ID_AR:
206       BKE_armature_free((bArmature *)id);
207       break;
208     case ID_AC:
209       BKE_action_free((bAction *)id);
210       break;
211     case ID_NT:
212       ntreeFreeTree((bNodeTree *)id);
213       break;
214     case ID_BR:
215       BKE_brush_free((Brush *)id);
216       break;
217     case ID_PA:
218       BKE_particlesettings_free((ParticleSettings *)id);
219       break;
220     case ID_WM:
221       if (free_windowmanager_cb) {
222         free_windowmanager_cb(NULL, (wmWindowManager *)id);
223       }
224       break;
225     case ID_GD:
226       BKE_gpencil_free((bGPdata *)id, true);
227       break;
228     case ID_MC:
229       BKE_movieclip_free((MovieClip *)id);
230       break;
231     case ID_MSK:
232       BKE_mask_free((Mask *)id);
233       break;
234     case ID_LS:
235       BKE_linestyle_free((FreestyleLineStyle *)id);
236       break;
237     case ID_PAL:
238       BKE_palette_free((Palette *)id);
239       break;
240     case ID_PC:
241       BKE_paint_curve_free((PaintCurve *)id);
242       break;
243     case ID_CF:
244       BKE_cachefile_free((CacheFile *)id);
245       break;
246     case ID_WS:
247       BKE_workspace_free((WorkSpace *)id);
248       break;
249   }
250 }
251
252 /**
253  * Complete ID freeing, extended version for corner cases.
254  * Can override default (and safe!) freeing process, to gain some speed up.
255  *
256  * At that point, given id is assumed to not be used by any other data-block already
257  * (might not be actually true, in case e.g. several inter-related IDs get freed together...).
258  * However, they might still be using (referencing) other IDs, this code takes care of it if
259  * #LIB_TAG_NO_USER_REFCOUNT is not defined.
260  *
261  * \param bmain: #Main database containing the freed #ID,
262  * can be NULL in case it's a temp ID outside of any #Main.
263  * \param idv: Pointer to ID to be freed.
264  * \param flag: Set of \a LIB_ID_FREE_... flags controlling/overriding usual freeing process,
265  * 0 to get default safe behavior.
266  * \param use_flag_from_idtag: Still use freeing info flags from given #ID datablock,
267  * even if some overriding ones are passed in \a flag parameter.
268  */
269 void BKE_id_free_ex(Main *bmain, void *idv, int flag, const bool use_flag_from_idtag)
270 {
271   ID *id = idv;
272
273   if (use_flag_from_idtag) {
274     if ((id->tag & LIB_TAG_NO_MAIN) != 0) {
275       flag |= LIB_ID_FREE_NO_MAIN | LIB_ID_FREE_NO_UI_USER | LIB_ID_FREE_NO_DEG_TAG;
276     }
277     else {
278       flag &= ~LIB_ID_FREE_NO_MAIN;
279     }
280
281     if ((id->tag & LIB_TAG_NO_USER_REFCOUNT) != 0) {
282       flag |= LIB_ID_FREE_NO_USER_REFCOUNT;
283     }
284     else {
285       flag &= ~LIB_ID_FREE_NO_USER_REFCOUNT;
286     }
287
288     if ((id->tag & LIB_TAG_NOT_ALLOCATED) != 0) {
289       flag |= LIB_ID_FREE_NOT_ALLOCATED;
290     }
291     else {
292       flag &= ~LIB_ID_FREE_NOT_ALLOCATED;
293     }
294   }
295
296   BLI_assert((flag & LIB_ID_FREE_NO_MAIN) != 0 || bmain != NULL);
297   BLI_assert((flag & LIB_ID_FREE_NO_MAIN) != 0 || (flag & LIB_ID_FREE_NOT_ALLOCATED) == 0);
298   BLI_assert((flag & LIB_ID_FREE_NO_MAIN) != 0 || (flag & LIB_ID_FREE_NO_USER_REFCOUNT) == 0);
299
300   const short type = GS(id->name);
301
302   if (bmain && (flag & LIB_ID_FREE_NO_DEG_TAG) == 0) {
303     DEG_id_type_tag(bmain, type);
304   }
305
306 #ifdef WITH_PYTHON
307 #  ifdef WITH_PYTHON_SAFETY
308   BPY_id_release(id);
309 #  endif
310   if (id->py_instance) {
311     BPY_DECREF_RNA_INVALIDATE(id->py_instance);
312   }
313 #endif
314
315   if ((flag & LIB_ID_FREE_NO_USER_REFCOUNT) == 0) {
316     BKE_libblock_relink_ex(bmain, id, NULL, NULL, 0);
317   }
318
319   BKE_libblock_free_datablock(id, flag);
320
321   /* avoid notifying on removed data */
322   if ((flag & LIB_ID_FREE_NO_MAIN) == 0) {
323     BKE_main_lock(bmain);
324   }
325
326   if ((flag & LIB_ID_FREE_NO_UI_USER) == 0) {
327     if (free_notifier_reference_cb) {
328       free_notifier_reference_cb(id);
329     }
330
331     if (remap_editor_id_reference_cb) {
332       remap_editor_id_reference_cb(id, NULL);
333     }
334   }
335
336   if ((flag & LIB_ID_FREE_NO_MAIN) == 0) {
337     ListBase *lb = which_libbase(bmain, type);
338     BLI_remlink(lb, id);
339   }
340
341   BKE_libblock_free_data(id, (flag & LIB_ID_FREE_NO_USER_REFCOUNT) == 0);
342
343   if ((flag & LIB_ID_FREE_NO_MAIN) == 0) {
344     BKE_main_unlock(bmain);
345   }
346
347   if ((flag & LIB_ID_FREE_NOT_ALLOCATED) == 0) {
348     MEM_freeN(id);
349   }
350 }
351
352 /**
353  * Complete ID freeing, should be usable in most cases (even for out-of-Main IDs).
354  *
355  * See #BKE_id_free_ex description for full details.
356  *
357  * \param bmain: Main database containing the freed ID,
358  * can be NULL in case it's a temp ID outside of any Main.
359  * \param idv: Pointer to ID to be freed.
360  */
361 void BKE_id_free(Main *bmain, void *idv)
362 {
363   BKE_id_free_ex(bmain, idv, 0, true);
364 }
365
366 /**
367  * Not really a freeing function by itself,
368  * it decrements usercount of given id, and only frees it if it reaches 0.
369  */
370 void BKE_id_free_us(Main *bmain, void *idv) /* test users */
371 {
372   ID *id = idv;
373
374   id_us_min(id);
375
376   /* XXX This is a temp (2.77) hack so that we keep same behavior as in 2.76 regarding collections
377    *     when deleting an object. Since only 'user_one' usage of objects is collections,
378    *     and only 'real user' usage of objects is scenes, removing that 'user_one' tag when there
379    *     is no more real (scene) users of an object ensures it gets fully unlinked.
380    *     But only for local objects, not linked ones!
381    *     Otherwise, there is no real way to get rid of an object anymore -
382    *     better handling of this is TODO.
383    */
384   if ((GS(id->name) == ID_OB) && (id->us == 1) && (id->lib == NULL)) {
385     id_us_clear_real(id);
386   }
387
388   if (id->us == 0) {
389     BKE_libblock_unlink(bmain, id, false, false);
390
391     BKE_id_free(bmain, id);
392   }
393 }
394
395 static void id_delete(Main *bmain, const bool do_tagged_deletion)
396 {
397   const int tag = LIB_TAG_DOIT;
398   ListBase *lbarray[MAX_LIBARRAY];
399   Link dummy_link = {0};
400   int base_count, i;
401
402   /* Used by batch tagged deletion, when we call BKE_id_free then, id is no more in Main database,
403    * and has already properly unlinked its other IDs usages.
404    * UI users are always cleared in BKE_libblock_remap_locked() call, so we can always skip it. */
405   const int free_flag = LIB_ID_FREE_NO_UI_USER |
406                         (do_tagged_deletion ? LIB_ID_FREE_NO_MAIN | LIB_ID_FREE_NO_USER_REFCOUNT :
407                                               0);
408   ListBase tagged_deleted_ids = {NULL};
409
410   base_count = set_listbasepointers(bmain, lbarray);
411
412   BKE_main_lock(bmain);
413   if (do_tagged_deletion) {
414     /* Main idea of batch deletion is to remove all IDs to be deleted from Main database.
415      * This means that we won't have to loop over all deleted IDs to remove usages
416      * of other deleted IDs.
417      * This gives tremendous speed-up when deleting a large amount of IDs from a Main
418      * containing thousands of those.
419      * This also means that we have to be very careful here, as we by-pass many 'common'
420      * processing, hence risking to 'corrupt' at least user counts, if not IDs themselves. */
421     bool keep_looping = true;
422     while (keep_looping) {
423       ID *id, *id_next;
424       ID *last_remapped_id = tagged_deleted_ids.last;
425       keep_looping = false;
426
427       /* First tag and remove from Main all datablocks directly from target lib.
428        * Note that we go forward here, since we want to check dependencies before users
429        * (e.g. meshes before objects). Avoids to have to loop twice. */
430       for (i = 0; i < base_count; i++) {
431         ListBase *lb = lbarray[i];
432
433         for (id = lb->first; id; id = id_next) {
434           id_next = id->next;
435           /* Note: in case we delete a library, we also delete all its datablocks! */
436           if ((id->tag & tag) || (id->lib != NULL && (id->lib->id.tag & tag))) {
437             BLI_remlink(lb, id);
438             BLI_addtail(&tagged_deleted_ids, id);
439             /* Do not tag as no_main now, we want to unlink it first (lower-level ID management
440              * code has some specific handling of 'nom main'
441              * IDs that would be a problem in that case). */
442             id->tag |= tag;
443             keep_looping = true;
444           }
445         }
446       }
447       if (last_remapped_id == NULL) {
448         dummy_link.next = tagged_deleted_ids.first;
449         last_remapped_id = (ID *)(&dummy_link);
450       }
451       for (id = last_remapped_id->next; id; id = id->next) {
452         /* Will tag 'never NULL' users of this ID too.
453          * Note that we cannot use BKE_libblock_unlink() here,
454          * since it would ignore indirect (and proxy!)
455          * links, this can lead to nasty crashing here in second, actual deleting loop.
456          * Also, this will also flag users of deleted data that cannot be unlinked
457          * (object using deleted obdata, etc.), so that they also get deleted. */
458         BKE_libblock_remap_locked(
459             bmain, id, NULL, ID_REMAP_FLAG_NEVER_NULL_USAGE | ID_REMAP_FORCE_NEVER_NULL_USAGE);
460         /* Since we removed ID from Main,
461          * we also need to unlink its own other IDs usages ourself. */
462         BKE_libblock_relink_ex(bmain, id, NULL, NULL, 0);
463         /* Now we can safely mark that ID as not being in Main database anymore. */
464         id->tag |= LIB_TAG_NO_MAIN;
465         /* This is needed because we may not have remapped usages
466          * of that ID by other deleted ones. */
467         // id->us = 0;  /* Is it actually? */
468       }
469     }
470   }
471   else {
472     /* First tag all datablocks directly from target lib.
473      * Note that we go forward here, since we want to check dependencies before users
474      * (e.g. meshes before objects).
475      * Avoids to have to loop twice. */
476     for (i = 0; i < base_count; i++) {
477       ListBase *lb = lbarray[i];
478       ID *id, *id_next;
479
480       for (id = lb->first; id; id = id_next) {
481         id_next = id->next;
482         /* Note: in case we delete a library, we also delete all its datablocks! */
483         if ((id->tag & tag) || (id->lib != NULL && (id->lib->id.tag & tag))) {
484           id->tag |= tag;
485
486           /* Will tag 'never NULL' users of this ID too.
487            * Note that we cannot use BKE_libblock_unlink() here, since it would ignore indirect
488            * (and proxy!) links, this can lead to nasty crashing here in second,
489            * actual deleting loop.
490            * Also, this will also flag users of deleted data that cannot be unlinked
491            * (object using deleted obdata, etc.), so that they also get deleted. */
492           BKE_libblock_remap_locked(
493               bmain, id, NULL, ID_REMAP_FLAG_NEVER_NULL_USAGE | ID_REMAP_FORCE_NEVER_NULL_USAGE);
494         }
495       }
496     }
497   }
498   BKE_main_unlock(bmain);
499
500   /* In usual reversed order, such that all usage of a given ID, even 'never NULL' ones,
501    * have been already cleared when we reach it
502    * (e.g. Objects being processed before meshes, they'll have already released their 'reference'
503    * over meshes when we come to freeing obdata). */
504   for (i = do_tagged_deletion ? 1 : base_count; i--;) {
505     ListBase *lb = lbarray[i];
506     ID *id, *id_next;
507
508     for (id = do_tagged_deletion ? tagged_deleted_ids.first : lb->first; id; id = id_next) {
509       id_next = id->next;
510       if (id->tag & tag) {
511         if (id->us != 0) {
512 #ifdef DEBUG_PRINT
513           printf("%s: deleting %s (%d)\n", __func__, id->name, id->us);
514 #endif
515           BLI_assert(id->us == 0);
516         }
517         BKE_id_free_ex(bmain, id, free_flag, !do_tagged_deletion);
518       }
519     }
520   }
521
522   bmain->is_memfile_undo_written = false;
523 }
524
525 /**
526  * Properly delete a single ID from given \a bmain database.
527  */
528 void BKE_id_delete(Main *bmain, void *idv)
529 {
530   BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
531   ((ID *)idv)->tag |= LIB_TAG_DOIT;
532
533   id_delete(bmain, false);
534 }
535
536 /**
537  * Properly delete all IDs tagged with \a LIB_TAG_DOIT, in given \a bmain database.
538  *
539  * This is more efficient than calling #BKE_id_delete repetitively on a large set of IDs
540  * (several times faster when deleting most of the IDs at once)...
541  *
542  * \warning Considered experimental for now, seems to be working OK but this is
543  *          risky code in a complicated area.
544  */
545 void BKE_id_multi_tagged_delete(Main *bmain)
546 {
547   id_delete(bmain, true);
548 }