[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53980] trunk/blender/source/blender: fix [#33841] Disabling and re-enabling live addon crashes blender (modal/ draw handler)

Campbell Barton ideasman42 at gmail.com
Tue Jan 22 07:16:53 CET 2013


Revision: 53980
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53980
Author:   campbellbarton
Date:     2013-01-22 06:16:49 +0000 (Tue, 22 Jan 2013)
Log Message:
-----------
fix [#33841] Disabling and re-enabling live addon crashes blender (modal/draw handler)

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/intern/rna_wm.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm.c
    trunk/blender/source/blender/windowmanager/wm_event_system.h

Modified: trunk/blender/source/blender/makesrna/intern/rna_wm.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_wm.c	2013-01-22 04:54:31 UTC (rev 53979)
+++ trunk/blender/source/blender/makesrna/intern/rna_wm.c	2013-01-22 06:16:49 UTC (rev 53980)
@@ -853,8 +853,11 @@
 
 	/* update while blender is running */
 	wm = bmain->wm.first;
-	if (wm)
+	if (wm) {
 		WM_operator_stack_clear(wm);
+
+		WM_operator_handlers_clear(wm, ot);
+	}
 	WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
 
 	RNA_struct_free_extension(type, &ot->ext);

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2013-01-22 04:54:31 UTC (rev 53979)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2013-01-22 06:16:49 UTC (rev 53980)
@@ -202,6 +202,7 @@
 		/* operator api */
 void		WM_operator_free		(struct wmOperator *op);
 void		WM_operator_stack_clear(struct wmWindowManager *wm);
+void		WM_operator_handlers_clear(wmWindowManager *wm, struct wmOperatorType *ot);
 
 struct wmOperatorType *WM_operatortype_find(const char *idnamem, int quiet);
 struct GHashIterator  *WM_operatortype_iter(void);

Modified: trunk/blender/source/blender/windowmanager/intern/wm.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm.c	2013-01-22 04:54:31 UTC (rev 53979)
+++ trunk/blender/source/blender/windowmanager/intern/wm.c	2013-01-22 06:16:49 UTC (rev 53980)
@@ -149,7 +149,32 @@
 	WM_main_add_notifier(NC_WM | ND_HISTORY, NULL);
 }
 
+/**
+ * This function is needed in the case when an addon id disabled
+ * while a modal operator it defined is running.
+ */
+void WM_operator_handlers_clear(wmWindowManager *wm, wmOperatorType *ot)
+{
+	wmWindow *win;
+	for (win = wm->windows.first; win; win = win->next) {
+		ListBase *lb[2] = {&win->handlers, &win->modalhandlers};
+		wmEventHandler *handler;
+		int i;
 
+		for (i = 0; i < 2; i++) {
+			for (handler = lb[i]->first; handler; handler = handler->next) {
+				if (handler->op && handler->op->type == ot) {
+					/* don't run op->cancel because it needs the context,
+					 * assume whoever unregisters the operator will cleanup */
+					handler->flag |= WM_HANDLER_DO_FREE;
+					WM_operator_free(handler->op);
+					handler->op = NULL;
+				}
+			}
+		}
+	}
+}
+
 /* ************ uiListType handling ************** */
 
 static GHash *uilisttypes_hash = NULL;

Modified: trunk/blender/source/blender/windowmanager/wm_event_system.h
===================================================================
--- trunk/blender/source/blender/windowmanager/wm_event_system.h	2013-01-22 04:54:31 UTC (rev 53979)
+++ trunk/blender/source/blender/windowmanager/wm_event_system.h	2013-01-22 06:16:49 UTC (rev 53980)
@@ -45,7 +45,8 @@
 typedef struct wmEventHandler {
 	struct wmEventHandler *next, *prev;
 
-	int type, flag;                     /* type default=0, rest is custom */
+	int type;                           /* WM_HANDLER_DEFAULT, ... */
+	int flag;                           /* WM_HANDLER_BLOCKING, ... */
 
 	/* keymap handler */
 	wmKeyMap *keymap;                   /* pointer to builtin/custom keymaps */
@@ -72,21 +73,17 @@
 
 } wmEventHandler;
 
-
-/* handler flag */
-		/* after this handler all others are ignored */
-#define WM_HANDLER_BLOCKING     1
-		/* handler tagged to be freed in wm_handlers_do() */
-#define WM_HANDLER_DO_FREE      2
-
-
-
 /* custom types for handlers, for signalling, freeing */
 enum {
 	WM_HANDLER_DEFAULT,
 	WM_HANDLER_FILESELECT
 };
 
+/* handler flag */
+enum {
+	WM_HANDLER_BLOCKING    = 1,  /* after this handler all others are ignored */
+	WM_HANDLER_DO_FREE     = 2   /* handler tagged to be freed in wm_handlers_do() */
+};
 
 /* wm_event_system.c */
 void        wm_event_free_all       (wmWindow *win);




More information about the Bf-blender-cvs mailing list