[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55904] trunk/blender/source/blender: fix for bug where notifiers could hold pointers to freed data which listeners would operate on .
Campbell Barton
ideasman42 at gmail.com
Mon Apr 8 15:03:04 CEST 2013
Revision: 55904
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55904
Author: campbellbarton
Date: 2013-04-08 13:03:04 +0000 (Mon, 08 Apr 2013)
Log Message:
-----------
fix for bug where notifiers could hold pointers to freed data which listeners would operate on.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_library.h
trunk/blender/source/blender/blenkernel/intern/library.c
trunk/blender/source/blender/windowmanager/WM_api.h
trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
Modified: trunk/blender/source/blender/blenkernel/BKE_library.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_library.h 2013-04-08 11:45:20 UTC (rev 55903)
+++ trunk/blender/source/blender/blenkernel/BKE_library.h 2013-04-08 13:03:04 UTC (rev 55904)
@@ -119,6 +119,7 @@
void recalc_all_library_objects(struct Main *main);
void set_free_windowmanager_cb(void (*func)(struct bContext *, struct wmWindowManager *) );
+void set_free_notifier_reference_cb(void (*func)(const void *) );
/* use when "" is given to new_id() */
#define ID_FALLBACK_NAME N_("Untitled")
Modified: trunk/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/library.c 2013-04-08 11:45:20 UTC (rev 55903)
+++ trunk/blender/source/blender/blenkernel/intern/library.c 2013-04-08 13:03:04 UTC (rev 55904)
@@ -823,6 +823,14 @@
free_windowmanager_cb = func;
}
+static void (*free_notifier_reference_cb)(const void *) = NULL;
+
+void set_free_notifier_reference_cb(void (*func)(const void *) )
+{
+ free_notifier_reference_cb = func;
+}
+
+
static void animdata_dtar_clear_cb(ID *UNUSED(id), AnimData *adt, void *userdata)
{
ChannelDriver *driver;
@@ -969,6 +977,10 @@
break;
}
+ /* avoid notifying on removed data */
+ if (free_notifier_reference_cb)
+ free_notifier_reference_cb(id);
+
BLI_remlink(lb, id);
BKE_libblock_free_data(id);
Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h 2013-04-08 11:45:20 UTC (rev 55903)
+++ trunk/blender/source/blender/windowmanager/WM_api.h 2013-04-08 13:03:04 UTC (rev 55904)
@@ -170,6 +170,7 @@
/* notifiers */
void WM_event_add_notifier(const struct bContext *C, unsigned int type, void *reference);
void WM_main_add_notifier(unsigned int type, void *reference);
+void WM_main_remove_notifier_reference(const void *reference);
void wm_event_add(struct wmWindow *win, const struct wmEvent *event_to_add);
Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c 2013-04-08 11:45:20 UTC (rev 55903)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c 2013-04-08 13:03:04 UTC (rev 55904)
@@ -187,6 +187,27 @@
}
}
+/**
+ * Clear notifiers by reference, Used so listeners don't act on freed data.
+ */
+void WM_main_remove_notifier_reference(const void *reference)
+{
+ Main *bmain = G.main;
+ wmWindowManager *wm = bmain->wm.first;
+ if (wm) {
+ wmNotifier *note, *note_next;
+
+ for (note = wm->queue.first; note; note = note_next) {
+ note_next = note->next;
+
+ if (note->reference == reference) {
+ BLI_remlink(&wm->queue, note);
+ MEM_freeN(note);
+ }
+ }
+ }
+}
+
static wmNotifier *wm_notifier_next(wmWindowManager *wm)
{
wmNotifier *note = wm->queue.first;
Modified: trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c 2013-04-08 11:45:20 UTC (rev 55903)
+++ trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c 2013-04-08 13:03:04 UTC (rev 55904)
@@ -145,6 +145,7 @@
WM_uilisttype_init();
set_free_windowmanager_cb(wm_close_and_free); /* library.c */
+ set_free_notifier_reference_cb(WM_main_remove_notifier_reference); /* library.c */
set_blender_test_break_cb(wm_window_testbreak); /* blender.c */
DAG_editors_update_cb(ED_render_id_flush_update, ED_render_scene_update); /* depsgraph.c */
More information about the Bf-blender-cvs
mailing list