[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